尽管我自己很少做开发,但是我知道找bug和改bug的经历就像便秘一样难受。语法以及功能性的bug对于普通程序员来说还是相对容易找到的,但是对没有经过专门的安全培训的人来说,很难发现涉及安全方面的bug,准确地说是漏洞。
一般大公司的产品上线之前都会有专门的安全工程师对代码进行审计,一般是借助工具进行半自动或纯手动地审计,这可以使产品的安全性得到很大的保障。但即使这样也无法百分之百保证不会爆出漏洞,更何况是小公司,甚至是一些的个体户,这样的群体里的程序员几乎就是万金油,开发和审计的活都干了,当然质量就大打折扣了。随着建站成本和难度的降低,Web安全的地位在安全圈里是与日俱增。很多人都会建自己的博客啥的,这种网站几乎全是套用的开源模板,好处是简单,坏处是一旦爆出漏洞,用同一模板的网站就是全军覆灭。下面是我找到的一套存在后台登录绕过的php模板。先在本地把网站跑起来。
进入后台登录界面
开启浏览器代理,打开渗透测试神器burpsuite。登录名写admin,密码123(正确的用户名和密码均是admin),点击登录之后抓包。
把抓到的数据包发送到repeater模块,进行测试可以看到,直接发送原数据包会返回错误。
把adminpass参数的值改成admin再发包可以看到返回包提示是正确的。
再把adminpass的值改成123,adminname的值改成admin’ # 之后再发包
可以看到,成功地绕过了。下面回到登录界面,把请求包按上面这么改,然后放包。
相应的后端php代码是长这个样子的
在这个login.php里面变量$adminsql用来传递要执行的sql语句,可以看到,对于它所接受的两个参数$adminname和$adminpass没有进行任何的过滤,直接带进了sql查询,所以我只要把用户名写成admin ‘ # 就可以把后面的 and adminpass =’$adminpass’语句给注释掉,让它不对密码进行判断,进而就可以对登录进行绕过。如果连用户名都不知道的话也可以绕过,用类似的思路,构造恒成立语句 ‘ or 1=1 #即可,如下
这是一个比较古老的漏洞了,但犯这个错误的程序员还不少。如今之所以存在这样的漏洞,却没有经常爆发大规模安全性问题的原因就在于防火墙。对网站造成危害的大多是脚本小子,就是那些只会利用别人写的工具而自己不具备编程能力的人,他们入侵网站主要就是为了炫技。对于如今的安全技术而言即使是免费的防火墙也能对脚本小子的入侵造成很大的阻力。所以,我的建议是在代码级防护跟不上的情况下,一定要给网站装上防火墙哪怕是免费的也行,不要吝惜防火墙占用的那点服务器资源,所谓“一墙掩百洞”是有道理的。不过吧,其实代码级的防护作用还是很有限的,不同的人写代码的风格不一样,很难做到不出漏洞。专业级的付费防火墙由安全专家编写,防护效果更值得信赖。具体到某一个网站上,漏洞肯定不止一两个,补过漏洞的人肯定知道,有些洞是不好补的,修改起来那就是无穷无尽了。到底如何选择,就看个人了。
本文作者:Mr Six
声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。