之前做btslab的时候就想找篇完整教程来对照学习的,可是发现网上只有xss部分,并无完整攻略,所以就自己单独完成了btslab,整体感觉还是比较容易,不过对于新手还是很不错,可以学到很多漏洞知识与代码审计,为了造福刚入门或是想入门的新手,我打算开始出一系列教程,全面介绍btslab(尊重作者劳动成果,转载需注明出处,否则必究)
认证
打开是一个login界面,第一想到的便是万能密码,所以测试
admin
'or'1'='1
轻而易举登录成功了,当然不能由此沾沾自喜,浅尝辄止,我们知其然也必要知其所以然。
首先我选择的是密码框作为注入点,注意到我用了单引号,不用说你们肯定明白了这里是字符注入(为什么?因为前篇教程中的get提交的参数id是一篇文章的索引,这个索引直接用数值型变量就可表达,但是这里的密码框需要的是一串字符,所以肯定只能是字符型注入)。
那为什么我单引号要放在or前面,第一个1的两边,和第二个1的前面呢,因为我猜想后台的sql语句判断密码的时候类似这样
select * from users where username='admin' and password='$password'
如果我提交'or'1'='1,那么第一个单引号将闭合原sql语句的引号,第二三个单引号是代表1这个字符,最后一个1字符为什么只有前面有引号?因为原sql语句本身后面就有一个引号,完整构造出来就行
select * from users where username='admin' and password='' or '1'='1'
这里由前向后结合,所以可以这样看
select * from users where (username='admin' and password='') or ('1'='1')
当然第一个括号里条件不会成立,因为admin账号的密码不为空,但是第二个成立了,'1'当然等于'1',所以整个sql语句成立,登录便成功
由此我们还可以构造很多其他语句达到同样的效果,比如
admin
'or 1#
admin
'or 1=1#
admin
'or 1-- -
这几个个原理差不多(补充一下,#和-- -(中间有个空格)在mysql中是注释,会注释掉后面所有内容),因为有了注释,所以sql语句#或-- -后面的内容舍弃,最终执行的语句便是
select * from users where username='admin' and password=''or 1
select * from users where username='admin' and password=''or 1=1
可能有人想问账号框可以注入吗?当然可以,而且更容易
账号只需要填admin'#或者admin'-- -,密码为空,便能直接登录
后台构造的语句便是
select * from users where username='admin'
当然注入方式还不止这些,不过我既然已经授人以渔,想必大家都能触类旁通,自己再试试构造吧