SQL注入(pikachu)
什么时SQL注入具体之前的博文都有,直接干就完事了。
来到靶场,发现这个是一个post的注入,直接bp拿起来就是抓
抓到包先测试一下,or 1=1# 能不能遍历
发现可以遍历,那就可以接着我们其他的操作。
具体之前的博客都有写,那些基础的操作这里就不说了。
从username判断,带入数据库查询的是字符串
构造查询语句为 xxx' or 1=1#
遍历成功,一样继续查表,字段。
最后查询出来的结果为
搜索型注入
这个类型,我们推测用的是SQL语句中的like来进行模糊判断
那我们就可以猜测模糊查询的字段应该是'%查询内容%'
那么我可以构造
xxx%' or 1=1#
一样遍历成功
xx型
说白了就是闭合的符号不一样
这里用xx') or 1=1#
一样能遍历
基于报错的信息获取
技巧思路:
在mysql中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。
select/insert/update/delete
要求:
后台没有屏蔽数据库报错信息,在语法发生错误的时候会输出在前端
updatexml() : 是mysql对xml文档数据进行查询和修改的xpath函数
extractvalue():是mysql对xml文档数据进行查询的xpath函数
floor():mysql中用来取整的函数
updatexml函数的作用就是改变(查找并替换)xml文档中符合条件的节点的值
语法:updatexml(xml_document,XPthstring,new_value)
第一个参数是字符串
第二个参数是指定字符串中的一个位置(Xpath格式的字符串)
第三个参数是将要替换成什么
Xpath定位必须是有效的,否则则会发生错误
接下来进入靶场
构造以下函数
kobe' and updatexml(1,concat(0x7e,database()),0)#
报错获取数据库名称
因为xpth报错注入每次只能显示一行
所以我们可以
kobe' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema = 'pikachu' limit 0,1)),0)#
爆出了第一个表,其他的就不再操作了,就还是一样的
insert/update/delete注入
进入靶场
我们知道insert就是在数据库中添加数据
那么我们注册一个账号,是不是就是在数据库中添加了你的账号数据
那么我们可以在注册页面插入我们的注入语句
我们猜测后台的mysql语句应该是
insert into user(name,password,sex,phone,address1,address2) value('xxx',123,1,2,3,4)
那我们可以在xxx的位置构造我们的注入语句
xxx' or updatexml(1,concat(0x7e,database()),0) or '
我们来分析以下为什么会成功
后台的mysql语句被我们拼凑成了
insert into user(name,password,sex,phone,address1,address2) value('xxx' or updatexml(1,concat(0x7e,database()),0) or '',123,1,2,3,4)
这样就会让我们的语句成功执行
接下来是update注入
我们先正经注册一个账号,然后登陆
我们来到这个界面
还是和之前一样,我们要想象,后台的mysql语句是怎么执行的
更新我们的信息,需要用到的时候update语句
当修改性别的时候推测后台执行了
update tables set sex = '$sex' where name = 'sbb';
这样我们可以在$sex处构造语句
xxx' or updatexml(1,concat(0x7e,database()),0) or '
把构造好的语句插入进去看看
update tables set sex = 'xxx' or updatexml(1,concat(0x7e,database()),0) or '
' where name = 'sbb';
就构造了一个闭合,可以查询我们想要查询的内容了
delete注入
既然是delete注入,那肯定是在删除这里,
我们先随便留几条言
然后我们开启抓包,进行删除操作
数据包如下
我们在url后面跟上我们的语句,因为这里传的是数值型,我们就不用单引号闭合,直接or就行了
这里要注意要进行一下url编码,否则不算一个完整的url
这样就完成了我们的注入,后面的操作都一样了
extractvalue()函数,从目标xml中返回包含所查询值的字符串
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为doc
第二个参数:XPath_string(Xpath格式的字符串)
Xpath定位必须是有效的,否则则会发生错误
用法其实跟updatexml一样
用字符型注入测试一下
xxx' and extractvalue(1,concat(0x7e,database())) #
基于floor()
floor是mysql的一个取整函数
payload
xxx' and (select 2 from (select count(*),concat(version(),floor(rand(0)*2)) x from information_schema.tables group by x) a)#
Http header注入
有些时候,后台开发人员为了验证客户端头信息,比如常用的cookie验证,或者通过http请求头信息获取客户端的一些信息,比如useragent、accept字段等等,会对客户端的http请求头信息获取并使用sql进行处理,如果此时没有足够的安全考虑,则可能会导致基于http头的sql注入漏洞
进入靶场
我们按照提示的账号密码登陆进来,发现提示我的信息被记录了。
就是一部分我们的请求头信息和端口信息
我们开启抓包
刷新
数据包如下
它既然标识出了我们的user-agent
那我们就从user-agent注入
传个单引号发现有报错信息,
利用我们构造的payload
一样搞定