Sql注入之靶场实操
1.首先用小皮打开靶场,演示操作用的是文章管理系统cms的源码
2.可以用御剑扫描以下后台,但是因为我这边特殊原因,就假装我已经扫描了吧,得到了该网站的后台管理页面
3.因为我们是sql注入,通过注入的方式来获得他的账密,所以不去爆破他的弱口令。
4.我们随便点击两条新闻进行对比发现,他们除了url中【?id=33,?id=32】之外没有任何区别
所以由此可见,更改id参数网站会自动跳转页面
5.注入点判断
1.?id=35 变换id参数+1/-1
2.?id=35’ 加单双引号判断是字符型还是数字型
加了单引号后有明显报错,根据报错判断存在数字型注入(如果报错里面有数字,就是字符型,如果没有,就是数字型)
3.判断是否有布尔类型状态
and1=1(真) and1=2(假)
两次页面相同,一般认为没有布尔类型状态,不同代表有布尔类型状态(页面是否正常与数据库是否报错是两个问题)
4.判断是否有延时注入
?id=35 and sleep(5)
点开控制台,找到网络
会发现后面的时间线是六秒钟,但是函数里是五秒,说明sleep()函数会对服务器响应造成影响
Ps:
1.如果页面+1/-1有变化,考虑联合注入
2.看看有没有报错,有报错就用报错注入,没有报错并没有回显就看是否有布尔状态
3.如果没有变化就考虑布尔类型状态
4.如果以上都没有,考虑延时注入
6.联合查询之判断列数
我们使用 order by 函数进行判断,因为我们要使用联合查询,并且在 ?id=35前面有一条select查询语句,要使用联合查询的话需要判断前面语句有多少列
这条语句的意思是按照第一个字段进行排序
当我们输入20时,发现报错提示,没有20 列
我们继续验证发现他有十五个列
我们使用union联合查询可以用数字把列数补齐
点击执行发现页面正常,因为我们不知道表名,但是根据mysql数据库特性,select语句在执行过程中并不需要指定表名。
7.判断显示位
因为页面显示的是第一章表的内容,那我们可以考虑让第一张虚拟表的查询条件为假,显示第二条记录从而构造sql语句
这里我用的是-33,也可以使用and 1=2,我们发现页面回显3,11两个数字,我们就可以把这两个数字用函数替换掉
这样就已经可以证明存在sql注入漏洞了
但是我们想拿到后台管理员的账密
我们把databases()换成hex(group_concat(table_name))就得到了十六进制,我们用bp去还原十六进制
用bp解码之后就得到了所有的表名,管理员账密可能存在cms_users表中,接下来需要查询表中的字段
Ps:为了避免单引号的使用,因为如果是cms_users出现的话要使用单引号,所以把它转化成十六进制,同时前面要加上0X,证明是十六进制
执行后发现得到了十六进制的数字放到bp进行解码
就得到了三个字段的内容,我们根据顺序查询username和password就可以
我们直接查表,用从concat函数,0x3a是冒号的十六进制
我们就得到了账号和加密后的密码
因为密码是用密文的形式保存在数据库中,观察密文得知是md5加密,我们可以用md5在线解密破解,md5解密加密来进行解密,可以忽略加密类型。
得到了管理员账号和密码
admin
123456
成功登入网站后台