SQLインジェクション3

1.なぜこの知識を理解すべきなのか

2.原則

3.自分の理解と実践

4. CTFタイトルケース





次の文は、敏感な言葉が、私は、著者が変わってしまう場合、それは非常に友好的、そうしてくださいコメントはありませんと言うかもしれ


知識のSQLインジェクション多く、私の頭が痛いので、私はまた、実際にゆっくり学習SQLはそうは思いませんでしたことを発見:毎日Tucaoを難しいですが、少しオープンに考えるだけで制限はありません。SQLインジェクションの学習はそれほど心配ではありません。SQLインジェクションの習得は非常に心配だと思います。いいえ、本当にDu Niangに行くことができます。今では多くのビッグウィッグがこの知識を共有するので、ゆっくりと学ぶことができ、熱い豆腐を食べることはできません。


なぜこの知識を理解すべきなのか

今日は、SQLインジェクションの一般的なインジェクションタイプについて説明します。エラーインジェクション、エラーインジェクションはCTFでも問題なく、かなり厄介なので、大部分の人はブラストにスクリプトを使用したり、アーティファクトsqlmapを使用したりして、これを失いました使い方はとても簡単ですが、鶏にはあまり使いません。







原理

ここで、昨日のSQLバイパスのナレッジポイントを追加します。今日はsql_puzzingの検索も見ました。それらの兄の言葉を借りました。隣のいとこのブログでこのバイパスが見つかりました
SELECT * FROM `user` WHERE id=1=0=1

ここに画像の説明を挿入
驚くべきことです。なぜid = 1の値を出力しないのか、なぜこの構文は間違っていないのでしょうか。
老人による観察と実験を繰り返した結果、mysqlステートメントは実際にはPHPなどのプログラミング言語に非常に似ており、構文は
上記のSQLステートメントに似ていることがわかりました。次のphpステートメントは実行されたときと同じです(実際、私はわかりません)

$pd=(1==0==1)
If(($pd==true)
SELECT * FROM `user` WHERE id=1
Else
SELECT * FROM `user` WHERE id!=1

これは、一見すると、主に鶏肉として多くの意味をなすはずです、私はsqlしか知りませんが、彼がまだすべきことを忘れます!=
実際、このバイパスの使用法は何ですか?
1.まず、無制限に拡張できます。主に=、「フィルタリングされていない場合は、非常に使いやすい
です。2.入力したページや変更されていないページがあるため、挿入がないと判断される場合があります。 andが#または ``に置き換わる可能性があるため、ページが変更されていないことがわかるため、このメソッドは
今日のトピック入力することはできません

エラー注入

一部のSQLは本当に良いです。私が問題を抱えている場所がわかっている場合は、すぐに報告して知らせてください。私のようなまっすぐな男性は、たとえ彼らが間違っていても、どこにいるのかわからないので、SQLが女の子であれば、それは本当に良いでしょう。何が悪いのか教えてください、それから私はそれを修正し、2つのカテゴリーに分けます:1.xpath構文エラー2.concat + rand()+ group_by()は主キーが複製される原因になります

xpath構文エラー

抽出値関数
抜け穴を理解するには、関数の関数を理解する必要があります:関数プロトタイプ:extractvalue(xml_document、Xpath_string)通常の構文:extractvalue(xml_document、Xpath_string);最初のパラメーター:xml_documentは、XMLドキュメントオブジェクトの名前である文字列形式です。パラメータ:Xpath_stringはxpath形式の文字列です。ターゲットxmlからクエリされた値を含む文字列を返す役割は2番目のパラメータにあります。2番目のパラメータはxpath形式の文字列のみを必要とするため、実際には多くの文字列の脆弱性があります。 concat関数を使用して新しい文字列を作成します。concatには実行の脆弱性があり、xpath構文文字列には、エラーによってXPath_stringが出力されるという機能があります。
select extractvalue(1,concat('~',(select database())))

ここに画像の説明を挿入
インターネットにはそのようなコードを持つ大物がたくさんいますが、あなたは知っているCTFを知っていますし、私はそれを理解しています。私が彼をフィルタリングしないと、私は面白くないと思います。直接フィルタリングして、何をしているのか確認し、16進数に切り替えくださいあなたは賢いです。 、しかし私はそれをフィルターで取り除くことができます。それを行う方法はありません。実際、問題はそれほど大きくありません。これが唯一の方法ではありません。この関数の抜け穴は、エラーがXPath_stringを出力することであり、上記の原則は最初のコンテンツがXML形式ではないことです文法、連結フィルタリングは、同等のものをすぐに見つけます。最初のコンテンツがxml形式の
構文でない限りフィルタリングは問題ありません。注:extractvalue()はストリングの最大長を照会できるため、32をサブストリングとして使用してインターセプトします

updatexml関数
updatexml()関数は、xmlドキュメントを更新する関数であるextractvalue()に似ています。構文updatexml(ターゲットxmlドキュメント、xmlパス、更新されたコンテンツ)実際、updatexmlはextractvalueと同等であるため、脆弱性は3に似ています。

concat + rand()+ group_by()は重複する主キーを引き起こします

間違いなく、この知識ポイントはエラー挿入の中心的な知識ポイントであり、理解するのは簡単ではありませんが、必要な機能を理解しているようです。1.Count2.Rand 3.Group by 4.Floor Countは、間違いなく非常に単純です。乱数を生成XXでグループ化XXでグループ化XXプログラミング言語は切り捨てを行うことがわかっています。たとえば、floor(1.1111)= 1関数の機能を理解してから、大画面を参照してください `` `ユーザーグループからカウントを選択(*) floor(rand(0)* 2); `` `最初にコードを見て、心配しないで、ゆっくりと分析し、原理を理解してから、バイパスします。上記のコードを自国語で記述し、ユーザーテーブルが最初にfloor(rand(0)* 2 )このキーがグループ化され、次にキーと等しいユーザーテーブルをチェックし、次に+1疑問点を確認します。1.フロア(rand(0)* 2)によって取得されたキーは何ですか2.グループ化によるグループ化は、統計の段階的なステップです。分析1.ソリューション:0
select count(*) from user group by id

ここに画像の説明を挿入
テーブルには最初に表示されます。これは、私には画像も真実もないことを言うまでもありません。
まず、IDでグループ化すると、分割できます。
ここに画像の説明を挿入
そのため、key = {id = 1、id = 2、id = 3}です。これが
すべての実行後の結果が表示される理由ですこれは、混乱を防ぐためではありません。
最初のステートメントの実行を開始してください。最初に、仮想テーブルが空です。
データの最初の行をクエリします。つまり、ユーザーテーブルを選択して
id = 1 見つけ、次に* from virtual table where id = 1を選択し
て、仮想テーブルがあること確認します。 id = 1
いいえOK!仮想テーブルにcount = 1に挿入します。
存在する場合は、count + = 1
更新します
これは簡単に理解できます
。OKより難しいものに進みます。

select count(*) from user group by floor(rand(0)*2);

上記の考えによれば
、我々は今、キー= {0,1}知る
クエリ最初のデータ行を、この時間は、床(RAND(0)* 2と仮定 )= 1、 すなわち、キー= 1を
キーに相当するものがないため、mSQLのようそれは、床(RAND(0)* 2で個別に鍵となるでしょう ) 値ではなく、クラス名に
、上記のように続けるんので、その
仮想テーブルを見ているどのキー(1)は
OKではないではありません!countに1を挿入します=仮想テーブルに1を挿入します
...
このロジックは正しいようですが、なぜエラーが報告されますか?私の問題はどこですか?
ええ、はい、はい、あなたは間違っています、間違っているのは1つだけです、floor(rand( 0)* 2)は複数
回実行されます。クエリ中に1回実行され、実際に挿入中に1回実行されます。仮想テーブルには、メインチェーンである特徴的な挿入キーがあります。つまり、テーブルで
実行できるのは1回だけです。挿入ステートメントは上記のものではありませんが、挿入フロア(rand(0)* 2)をcount = 1に挿入します。
これはどうして間違っている可能性がありますか。急いではいけません。最初にアスペクトテーブルfloor(rand(0)* 2)が次のように設定されています。
クエリ中にx x = 1、x = 1のキーが仮想テーブルにないため、挿入を実行します。このとき、xが1または0になっても、
仮想テーブルにはこれらの値がないため、エラーは報告されません
x = 1が仮想テーブルに格納され、x = 0がクエリ中に存在し、x = 0が仮想テーブルに存在しないと想定すると、必ずしも幸運であるとは限りません。したがって、挿入、この時点でxは1になり、挿入xにカウント= 1、仮想テーブルがすでに存在するため、x = 1、x = 1はメインチェーンであり、必然的にエラーを報告し、
画像が退屈に
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
なることはありません。最初に理解できず、何度か読みます。ゆっくりとゆっくり分析してください

自分の質問のいくつかを分析します

1.フロアのみにする
ことはできますか?2.ランドブラケットは0
のみにする
ことができますか?3.カウントとグループ化のみを組み合わせることができますか?4.フロア(rand(0)* 2)の値のみ0-1にできますより大きくできませんか?
1.解決策:必ずしもそうでは
ありません。key = 2つの隣接する整数である限り、切り捨ても可能です。2.解決策:いいえ、randは乱数rand( 0)出力シードには規則性があり、rand()には規則性がないため、アフリカかヨーロッパかによって異なります。0は他のものと置き換えることもできます
。解決策:はい、現在、他の集計関数のため、とにかく他のエラーを報告しようとしました。4。key
= 2つの隣接する整数にして、keyの値が多すぎないようにしてください。









CTFタイトルケース

エラーインジェクションで遭遇するCTFが少ないので、そうです。
この兄貴の記事をチェックしてください、元の質問は見つかりませんでした

リリース6元記事 ウォンの賞賛0 ビュー116

おすすめ

転載: blog.csdn.net/a1309525802/article/details/105394272