union 注入
只有知道正确的字段数才能去拼接union
如何去猜对应查询的字段数:在sql中用order by 进行猜测
order by 1 查询结果按照第一列进行排序
order by 2 查询结果按照第二列进行排序
在实际的猜测中可以用二分法进行测试
用5试一下
报错
用3试一下
不对
用2试一下
对了
证实主查询里只有2个字段
接下来用union去做拼接
xx’union select database(),user()#
查询数据库,用户名成功
mySQL小知识补充
information_schema 拿下数据库
先测试是否存在注入点
输入’ 报错 说明我们输入的’被拼接到数据库中去了,所以存在sql注入
猜测是字符型,用 ’ 或 " 进行测试
遍历表里数据成功
下面接着获取基础信息
先order by 一下 再用联合查询
确认主查询有2个字段,然后用union
要先获取基础信息,因为如果想进一步去获取 information_schema 里面的数据,至少要知道当前的数据库实例的名称。所以要先获取当前数据库的名称。
kobe 'union select database(),user()#
成功获取数据库名称 pikachu
知道了数据库名称之后,可以进一步地通过information_schema去获取数据
构造一个payload
kobe’ union select table_schema,table_name from information_schema.tables where table_schema=‘pikachu’#
进行进一步测试 查询users
kobe’ union select table_name,column_name from information_schema.columns where table_name=‘users’#
成功得到users表的信息
构造联合查询
kobe’ union select username,password from users#
密码经过加密,需要处理一下
复制一下 到网上找彩虹表做对应的碰撞解出明文
PS:彩虹表:彩虹表是一个用于加密散列函数逆运算的预先计算好的表, 为破解密码的散列值(或称哈希值、微缩图、摘要、指纹、哈希密文)而准备。一般主流的彩虹表都在100G以上。 这样的表常常用于恢复由有限集字符组成的固定长度的纯文本密码。这是空间/时间替换的典型实践, 比每一次尝试都计算哈希的暴力破解处理时间少而储存空间多,但却比简单的对每条输入散列翻查表的破解方式储存空间少而处理时间多。使用加salt的KDF函数可以使这种攻击难以实现。彩虹表是马丁·赫尔曼早期提出的简单算法的应用。
基于函数报错的注入
常用的报错函数:updatexml()、extractvalue()、floor()
函数在运行时,我们构造对应的报错点就可以把相关的报错信息报出来,我们可以通过对应的报错信息获取对应的内容。
select/insert/update/delete都可以使用报错来获取信息。
前提条件:后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
Updatexml() 函数 需要传三个参数
xml_document 要操作的文档的名称
Xpathstring 对哪个地方的内容进行更新 Xpath指定位置写法,进行定位
new_value 新的值,对xml文档位置里面的内容用newvalue参数的内容进行替换
select 下报错演示
先确定是不是报错型的sql注入
vension() 可以写表达式,表达式执行结果作为报错返回出来
用concat方法:把传进去的参数组合成一个完整的字符串打印出来,也可以执行表达式,可以把前面的字符串和后面表达式执行的结果构成一个 字符串拼起来,组成一个完整的字符串。
改一下payload 把想要获得数据的表打死放到 concat(version()) 里面 0x7e是~的16进制表达,避免被报错信息吃掉。
获取到了对应的数据库版本
·获取数据库名称
limit(0,1) 从第0个位置取,取一行
得到数据库第一个表的名称
以此类推。
获得了表名称和字段名称之后就可以构建uesername去获取用户名称
获取到username的第一个字段
获取密码
基于insert update delete 的注入利用案例
注册信息
insert 注入:前端输入的信息最终会被后台通过insert这个操作插入到数据库里面去。
update 更新
delete
删除留言
id 是数值型的 没有 ’
1 or updatexml(1,contat(0x7e,database()),0)
改一下payload
因为参数是在url里面get请求提交传递的,所以需要做url编码,通过自带的转换工具进行相关编码
三个常用的用来报错的函数 extractvalue()
kobe’ and extractvalu(0,concat(0x7e,version()))#
floor() 取整
kobe’ and (select 2 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#
floor()函数报错条件
1.运算里要有count
2.运算里要有 group by
3.运算里要有 rand
http header 注入
登陆一下试试
把抓到的包 发送到repeater 改一下UA 把UA 改成’ go一下 提示错误信息,说明此处存在sql注入漏洞,因为把我们输入的’ 放到后台执行了。我们可以用payload进行测试
firefox’ or updatexml(1,concat(0x7e,database()),0) or ’
写到UA里面 go一下,把数据库实例名称返回回来了
获取cookie后把内容导到数据库里面去拼接进行相关操作也可能产生sql注入漏洞。
测试cookie
在用户名后面增加一个’ 看会不会报错
出现报错信息,说明此处存在sql注入漏洞
用payload测一下admin’ and updatexml(1,concat(0x7e,database()),0)#