目录
二:通过information_schema拿下数据库(手工测试)
一: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:里面有某个表的所有字段名称)。
但是,当我们是一个攻击者身份的时候,有些数据就变成了未知,所以得从最基础的信息获取到最终拿下重要信息!
开始:
- 首先确定存在sql inject漏洞,比如输入单引号/双引号,提示有语法错误,说明后台对输入并没有过滤,输入的内容已经被拼接到sql语句中了。
- 猜测为什么类型的注入,并利用order by获取正常查询的字段数。
- 确定字段数(比如是2)后,就可以上union函数了,做联合查询。先获取基础的:select database(),user() (其他用来构造闭合的字符已省略)。
- 通过上一步得知当前的数据库名称为 ‘pikachu’,然后利用 union select table_schema,table_name from information_schema.tables where table_schema=’ pikachu‘ 来获取pikachu数据库里所有表的名称。
- 通过上一步操作,得知在pikachu数据库里面有member这张表,然后利用union select table_name,column_name from information_schema.columns where table_name=’member’来获取member这张表中的字段名称。
- 通过上一步的操作,得知在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:
输入即可获取相关信息。