PHP是一种被广泛使用的脚本语言,尤其适合于web开发。具有跨平台,容易学习,功能强大等特点,据统计全世界有超过34%的网站有php的应用,包括Yahoo、sina、163、sohu等大型门户网站。而且很多具名的web应用系统(包括bbs,blog,wiki,cms等等)都是使用php开发的,Discuz、phpwind、phpbb、vbb、wordpress、boblog等等。
随着web安全的热点升级,php应用程序的代码安全问题也逐步兴盛起来,越来越多的安全人员投入到这个领域,越来越多的应用程序代码漏洞被披露。面对这种现状,PHP漏洞“挖掘者”所能得到的漏洞也将越来越少。但是“穷则思变”,既然传统的审计方法不能达到挖掘漏洞的目的,那么我们何不尝试新的审计手法与思路呢?代码审计的目的是以挖掘到可以利用的漏洞,所以我们不必通篇的去将代码完全看懂,但是在开始之前做一些准备还是必须,就像渗透之前,我们也需要收集足够多的目标信息,利用工具和制定渗透计划一样。
程序的本质是变量与函数,漏洞所依赖的也无法脱离这两个元素。让我们先来看下漏洞形成的条件
1.可以控制的变量【一切输入都是有害的】
2.变量到达有利用价值的函数[危险函数]【一切进入函数的变量是有害的】
漏洞的利用效果最终也取决与函数的功能。所以我们在下面讲述漏洞挖掘的过程中,也将围绕着这两个元素来展开。
一个网站的安全性涉及很多方面,代码的安全性是其中的一个重要因素,代码审计就是用来提高代码安全性的,那么我们就来讲讲代码审计,这次我们用到的是dvwa。
DVWA(DamnVulnerableWebApplication)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。
下面简单的以dvwa里面sql注入的三种等级代码来说一下代码审计。
首先比较low、medium、high三种级别的php代码:
Low:
Medium:
High:
红框里面就是三种代码的不同之处,发现从low到medium多了一句,medium到high又多了一句。
dvwa的sqlinjection里面有个输入框,三种等级下输入1,结果都一样,浏览器地址栏变成:
http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
输入框下面会出现:
1、当在low级下输入1′,发现浏览器地址栏变成:
http://localhost/dvwa/vulnerabilities/sqli/?id=1′&Submit=Submit#
并出现错误:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear”1”’atline1
2、当在medium级下,输入1′,发现地址栏和low级一样,提示错误:
YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear‘\”atline1
3、再看high级下,输入1′,地址栏依旧,没出现错误,也没有出现正常的查询结果。
正常情况下,当用户在输入框输入1,从数据库查询id=1的用户,查询语句是
SELECTfirst_name,last_nameFROMusersWHEREuser_id=‘$id’
就会得到id=1的用户信息。
但是在1后面加个单引号后在low和medium级别下出现错误,看回上面图片:
low级下没有对输入进行任何处理,直接把用户输入的东西放到查询语句中进行查询;
medium级下添加了mysql_real_escape_string()函数,这个函数是转义sql语句中使用的字符串中的特殊字符,就像在错误提示中显示在单引号前加\;
high级下在转义函数前面加了另一个函数stripslashes(),这个函数是去除addslashes()函数添加的反斜杠,因为high级下,php的magic_quotes_gpc为on,对所有的GET、POST和COOKIE数据自动运行addslashes()函数。所以要使用stripslashes()函数
三种等级下sql注入的情况很明显了,现在深入。
low:http://localhost/dvwa/vulnerabilities/sqli/?id=1orderby2+�C+&Submit=Submit#
http://localhost/dvwa/vulnerabilities/sqli/?id=1′orderby2+�C+&Submit=Submit#
http://localhost/dvwa/vulnerabilities/sqli/?id=1′unionselect1,2+�C+&Submit=Submit#
http://localhost/dvwa/vulnerabilities/sqli/?id=1′unionselect1,concat_ws(char(32,58,32),user(),database(),version())+�C+&Submit=Submit#
就这样把当前用户、数据库、php版本爆了出来。concat_ws是mysql里面的函数。
medium下会自动加反斜杠转义特殊字符,会破坏查询语句,页面上会提示出错;high下id只有正常情况下才会出现正确信息,其余的都不会出现任何信息。
除此之外,high级别中还有两处不同,判断输入是否为数字并将其值用单引号包含起来,以确保非法字符无法起作用。
到high级别的php代码已经达到相当高水平的安全性了,但是不能说一定是最安全的,因为还是可能会出现漏洞的。代码审计就是检查源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞,并提供代码修订措施和建议。从而在系统开发阶段/运维阶段进行深入的问题查找和消灭过程。
本文出自 “Taro” 博客,谢绝转载!