|
根据敏感函数来逆向追踪参数的传递过程,是目前使用得最多的 种方式,因为 大多数漏洞是由于函数的使用不当造成的,另外非函数使用不当的漏洞,如SQL注 入,也有一些特征,比如Select. Insert等,再结合From和Where等关键字,我们就 可以判断这是否是一条SQL语句,通过对字符串的识别分析,就能判断这个SQL语 句里面的参数有没有使用单引号过滤,或者根据我们的经验来判断 像HTTP头里面 的HTTP_CLIENT_1P和HTTP_X_FORWORDFOR等获取到的IP地址经常没有安全过滤就直接拼接到SQL语句中,并且由于它们是在$_SERVER变量:中不受GPC的影响, 那我们就可以去查找HTTP_CLIENT_IP和HTTP_X_FORWORDFOR关键字来快速寻 找漏洞这种方式的优点是只需搜索相应敏感关键字,即可以快速地挖掘想要的漏洞,具有 可定向挖掘和高效、高质量的优点。
其缺点为由于没有通读代码,对程序的整体框架了解不够深入,在挖掘漏洞时定位 利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。
注入挖掘案例
这次找个espcms应用程序为事例演示整个注入漏洞的查找过程,首先我们得先把项目导入到Seay审计系统中,然后点击自动审计功能,系统会自动帮我们扫描可能存在的漏洞。
这里我们选取第26条SQL注入漏洞数据,双击进入定位到该SQL语句中
可以看到非常直观地看到$parentid变量是怎样获得的
然后我们定位accept函数的实现方法,选中accept函数并右击定位函数即可。我们可以看到我们传入的变量parentid和R参数代表的是POST、GET中获取的值,最后一个经过了daddslashes这个函数进行处理
从这条SQL语句中我们可以看到对单引号等字符进行过滤,并不需要闭合,可以直接注入。
$sql = "select * from $db_table where parentid=$parentid";
接着,我们定位到citylist.php这个文件中,看到oncitylist这个函数在important这个类中,点击全局搜索功能,双击进入index.php这个文件
可以看到这里存在一个include文件操作,但是经过了daddslashes函数的操作,我们无法进行截断使其包含任意文件,只能包含本地的PHP文件,若拥有本地的MYSQL的root权限,导出到tmp目录中就能实现文件包含注入攻击
这里我们构造一个EXP的URL进行完成注入
http://127.0.0.1/espcms/adminsof ... ist&parentid=-1 union select 1,2,user(),4,5
上面中我们提到了根据敏感关键字来回溯传入的参数,是一种你想追踪的思路,我们也提到了这种方式的优缺点,实际在需要快速需寻找漏洞的情况下用回溯参数的方式是非常有效的,但这种方式并不适合运用在企业中做安全运营时的场景,在企业中做自身产品的代码审计时,我们需要了解整个应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
通读代码也是有一定的技巧的,并不是随便找个文件每一行读完就可以了,这样你会很难真正读懂这套程序,也很难理解代码的业务逻辑,首先我们要看程序的大体结构,如主目录有那些文件,模块目录有哪些文件,插件目录有哪些文件,除了关注文件,还要注意文件的大小,创建时间。我们根据这些文件的命名就大体知道这个程序实现了那些功能,核心文件有哪些。
本文找了eyoucms为例:通过文件下可以看出:后台模块,前台模块,数据库文件,配置文件,用户模块等......
通读全文技巧:函数集文件往往函数集文件里面都包含通用函数。因此,可以在index.php文件或者一些功能性文件头部找到。配置文件通常有config关键字,通过这个文件能了解程序的小部分功能。
安全过滤文件安全过滤文件很重要,决定我们找到的可疑点能否利用。大多数应用程序都会在程序入口处对参数用函数进行过滤。index文件通过读index文件,可以了解整个程序运行流程,架构,包含的核心文件,不同目录的不同index文件有不同的实现方式。所以,最好将几个核心目录的index文件都读一遍。PHP常用过滤函数
- <font size="4">addslashes(string $str)</font>
复制代码 返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。
- <font size="4">strip_tags( string,[allowed_tags])</font>
复制代码 从字符串中去除html或者php中的标记。第二个参数可选,是允许的标记有哪些。
- <font size="4">str_replace(<em>find</em>,<em>replace</em>,<em>string</em>,[<em>count]</em>)</font>
复制代码 find是找到要替换的内容,replace是替换成这里的值,string是查找目标的范围。前三个变量都是必须的,count可选,是对替换数进行计数的变量。
- <font size="4">preg_replace($find,$replace,$subject,$limit,$count)</font>
复制代码 preg_replace()函数执行一个正则表达式的搜索和替换。前三个参数和str_replace()一样的用法$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。默认是-1(无限制)。$count: 可选,为替换执行的次数。
- <font size="4">array_merge($arr1,$arr2,$arr3,……,$arrn)</font>
复制代码 将n个数组合并成一个数组;
- <font size="4">strlen($str)返回字符串长度</font>
复制代码 函数返回字符串 "Hello" 的长度;
- <font size="4">getenv() 获取环境变量</font>
复制代码 比如getenv('HTTP_CLIENT_IP');
- <font size="4">strcasecmp($str1,$str2)</font>
复制代码 不区分大小写比较两个字符串字符大小,$str1<$str2,return 1;$str1>$str2,return 1;$str1=$str2,return 0;
- <p><strong><font size="4">preg_match($pattern,$subject,[$matches])</font></strong></p>
复制代码 $pattern是正则匹配,$subject是要匹配的一个范围对象,如果提供了参数matches,它将被填充为搜索结果。$matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。(这个$matches不是太懂);
- <font size="4">header(string,replace,http_response_code)</font>
复制代码 header() 函数向客户端发送原始的 HTTP 报头。
认识到这一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题):
上面这个实际上就是302重定向
下面这个是提示用户保存一个生成的 PDF 文件(Content-Disposition 报头用于提供一个推荐的文件名,并强制浏览器显示保存对话框):
require_once($file)
require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
unset($var1,$var2,……,$varn)
销毁变量,用法有点诡异,看例子
运行后的结果:
可以看到函数内echo $a会得到空,因为unset将$a在函数内的局部变量销毁了。而外部调用环境的$a仍保留着没有被unset进行销毁,上面官方描述上写了调用环境的$a将保留的是在使用unset()前的变量值,因此echo出bars,而不是bar。
了解整体结构之后,再进行功能点审计
按上面的文件查看步骤,函数集文件->配置文件->过滤文件->index文件,下面就应该测试最容易出现漏洞的地方了,也就是各个功能点。
这个时候,最好下载相关文件,部署到环境中,然后点点点,先简单黑盒测试,若没发现什么弊端,再去看代码,并且这个时候看代码就可以省略一些黑盒中测试过的点了。
上传文件功能只要是能上传的地方,就都可能存在漏洞。常见的就两种,一个是格式没有限制,或者过滤不完善,导致各种任意文件上传。第二个就是文件名没有进行sql注入检测,很多程序员会忘记这一点,导致sql注入。因为文件名也是要存到数据库中的。
文件管理功能如果程序员在开发中,直接将文件名或者文件路径在参数中传递,那么就可能导致攻击者利用../或者..\来进行跳转目录达到任意文件操作,比如任意文件读取。
另外,直接用文件名或者文件路径在参数中传递,还可能导致xss,因为,程序可能需要在页面中输出文件名字,这个时候,若文件名字也没有过滤,那么就会存在xss攻击。
登录认证功能登录认证功能不是指一个登录过程,而是整个操作过程中的认证。而现在认证又是基于cookie和session,程序又经常会把用户账号等认证信息放到cookie中,来保持用户可以长时间登录,不会因为session超时或者关闭浏览器就退出用户。但是,如果这段cookie没有进行加密,就会导致任意用户登录的漏洞!只需要知道用户的部分信息即可登录!
找回密码功能找回密码的时候,有的网站做的不好,改密码不用填写旧密码,直接改,然后给用户发送验证码,但是由于验证码是纯数字,而且,如果验证码时间过长,那么就会被爆破出来。
|
|