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

 

一样搞定

 

posted @ 2019-10-08 16:31  浮云饭  阅读(5814)  评论(0编辑  收藏  举报