前言
最近深感自己语言基础差,得恶补一下了= =
SSRFMe
考察点:Hash长度拓展攻击
这题我了解到有三种解法,其中一个字符串拼接还挺有意思的,不过听说师傅投先知没有被收,估计应该在博客里,有兴趣可以去学习一波。
直接给了代码,我们审计一下:
1 | #! /usr/bin/env python |
先看Exec()
函数:
1 | def Exec(self): |
主要功能有scan
和read
;scan
会执行一个scan()函数(param可控)、并将结果打印并存入result.txt,read
将result.txt的内容读出来。
于是我们跟进scan()函数:
1 | def scan(param): |
发现可以读取本地文件,但是waf处有file和gopher的黑名单:
1 | def waf(param): |
根据hint尝试访问./flag.txt,发现返回签名
看一下验证签名的函数:
1 | def checkSign(self): |
很容易想到hash拓展read读取flag
思路:先访问flag.txt获取初始sign,然后hash拓展实现scan储存和read读取即可获取flag。
hash长度拓展我这里用的是HashPump,原理可以参考我的另一篇文章:Hash长度拓展攻击
注意:记得把’\x’换成’%’,另外key的长度是24不是16(包含’flag.txt’)
注意:Exec()函数和geneSign()函数在不同路由下,分别是’/De1ta’和’’/geneSign’
flag到手~
Shellshellshell
考察点:原题搜索(逃 、SoapClient类反序列化。
首先扫目录把源码down下来,然后开始审计:
发现insert()函数有点问题:
1 | if(isset($_POST['signature']) && isset($_POST['mood'])) { |
发现可以延时注入,于是跑一下admin的密码,写个脚本:
1 | # -- coding: utf-8 -- |
跑一下脚本,即可得到admin的密码,尝试登录,发现登录失败,因为admin设置了非本地ip不允许登录,我们需要绕过$_SERVER [‘REMOTE_ADDR’]
,很容易想到SSRF,再加上存在反序列化漏洞,这里可以考虑利用SoapClient原生类的反序列化来实现SSRF。
贴个脚本:
1 |
|
将跑出的payloda注入进数据库,访问action=index即可触发反序列化,之后用新的Cookie登录,由于该Cookie与admin绑定,将会直接以admin身份登录,从而绕过了限制。
登录以后是一个裸传文件,直接上传一个shell,Antsword连接。
根据之前源码中的提示,flag应该在内网,于是我们康康本机地址和/etc/hosts,扫一下C段,发现在.7的80端口有php文件,wget保存下来一看,貌似又是一道原题:
直接贴一个glzjin师傅的php脚本Orz:
1 |
|
PS: nc扫描主机端口:nc -z -v host_name port_range
。
最后即可获得flag:
小结
shellshellshell这道题学到很多,之后应该会深入学习一下SoapClient的反序列化 ( 有时间的话,咕咕咕