pikachu靶场--SQL inject--必备补充知识

目录

一:sqli手动测试 基于union联合查询的信息获取

二:通过information_schema拿下数据库(手工测试)

三:基于函数报错的信息获取

updatexml()函数:

extractvalue()函数:

floor()函数:



一:sqli手动测试 基于union联合查询的信息获取

前面为一句正常的sql语句,后面通过union联合了又一条查询语句,且需要注意的是,前后查询的字段数需要一致!

演示:

可见,利用union从两张表中,共查询到了四个字段的值。这就意味着,我们在将来渗透的时候,可以采用(正常查询)union(恶意查询)的方式来获取我们想要的信息。但是,我们必须提前知道正常查询里面是几个字段,然后恶意查询才能构造好。

知晓正常查询字段数的方法:利用 order by!

Order by 数字:表示查询出来之后按第几行在最上面进行排序,如

当order by后面的数字大于前面的字段数是时,它就会报错。

在pikachu演示如下: 大于时:

 

 

刚好等于时:

 

由此可见,字段数为2。之后通过union和sql中的一些函数如 select database()

Select user() select version(),获取到目标的数据库名称,用户,版本等等。


二:通过information_schema拿下数据库(手工测试)

流程:从前面最基础的信息获取-->最终拿下整个数据库的敏感数据

MySQL数据库中有一个数据库“information_schema”,里面有两张比较重要的表:“tables”(里有字段 table_schema:里面有所有数据库名称,字段table_name有某个数据库里所有表的名字)和“columns”(里有字段 column_name:里面有某个表的所有字段名称)。

但是,当我们是一个攻击者身份的时候,有些数据就变成了未知,所以得从最基础的信息获取到最终拿下重要信息!

开始:

  1. 首先确定存在sql inject漏洞,比如输入单引号/双引号,提示有语法错误,说明后台对输入并没有过滤,输入的内容已经被拼接到sql语句中了。
  2. 猜测为什么类型的注入,并利用order by获取正常查询的字段数。
  3. 确定字段数(比如是2)后,就可以上union函数了,做联合查询。先获取基础的:select database(),user()  (其他用来构造闭合的字符已省略)。
  4. 通过上一步得知当前的数据库名称为 ‘pikachu’,然后利用 union select table_schema,table_name from information_schema.tables where table_schema=’ pikachu‘ 来获取pikachu数据库里所有表的名称。
  5. 通过上一步操作,得知在pikachu数据库里面有member这张表,然后利用union select table_name,column_name from information_schema.columns where table_name=’member’来获取member这张表中的字段名称。
  6. 通过上一步的操作,得知在member表中,有username和password这两个字段。

最后直接 union select username,password from member 获取账号密码。(用彩虹表对密码进行md5解密,攻击到此结束)(Ps:数据库里面是可以跨数据库去查询的。)


三:基于函数报错的信息获取

  • :常用的报错函数updatexml() , extractvalue(), floor()
  • 基于函数报错的信息获取(select/insert/update/delete)

在前面的案例中,注入点都是在select语句中,这儿不一样,用更为复杂一点的。

关键点在于函数在报错之前,会先把输入的内容(表达式)先去执行一次并且输出到前端。

updatexml()函数:

 

第一个参数是要操作的xml文档的名称,第二个是对xml文档进行内容更新的地点,指定一个位置,第三个就是新的值。接下来用pikachu演示:

以字符型输入为例,首先确定它有没有报错,然后用 kobe’ and updatexml(1,version(),0)#测试,函数的首尾两个值错误,所以会直接执行中间的表达式(版本信息),然后以报错的形式返回到前端。可惜信息不完整:

所以需要对payload进行改造,用MySQL里的一个方法“concat”,可以把传进去的两个参数组合成完整的字符串然后打印出来。即 kobe’ and updatexml(1,(concat(0x7e,version()) ,0)#

为什么用0x7e?

它其实是“~”的十六进制,避免返回信息被吃掉 。

后面把version()换为database(),或是select语句,即可获取自己想要的信息。

extractvalue()函数:

Xpath中可以把表达式拼进去,然后把表达式执行的结果作为错误的内容反馈回来。

同样是在字符型中做对应的测试,构造闭合 kobe' extractvalue(0,concat(0x7e,database()))#即可,在这里呢,效果和updatexml()函数是一样的。  

floor()函数:

有取整的效果。

要求:

1.运算中要有count

2.运算中要有group by

3.运算中要有随机性取值

构造payload:

 输入即可获取相关信息。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值