注释:文章图片较为模糊,这是我年前写的文章,我将Word以附件的形式上传。
一;常用代码审计思路
常见的代码审计漏洞方式有:根据敏感关键字回溯参数,查询可控变量,寻找敏感功能点,通读全文。
下面是我的代码审计方式,不正宗。各位随意看看。以bluecms为例:
1;初步查看源码,了解其架构。特别需要注意的是common.fun.php,mysql.class.php,user.fun.php等文件。(判断出来没有关系,来来来,通读一遍就好。)
e.g:data文件夹包含一些配置文件,include文件夹包含了自定义的函数,类等文件。
2;我们都知道渗透的话,我们着重关注三点:输入点,数据流,输出点。那么首先我们可以打开网页来判断输入点位置,常见输入点位置用户登录界面,搜索栏,留言板,一些公告URL参数位置。
3;通过对应输入点位置的代码,追踪数据流,主要关注是否存在过滤代码。
4;判断出错函数是否被其他文件调用。大可能概率其他包含的文件也是存在的。
二;SQL注入漏洞审计
2.1;SQL注入总结
正常情况,sql注入的位置经常出现在登陆页面,订单处理等。注意x-forward-for以及client-ip也会经常出现。因为该值是主动获取的。并不需要用户输入,所以经常性的不会进行过滤。在订单系统里面多个订单与购物车的交互,导致复杂性提升,容易出现二次注入。值得注意。
2.2;BlueCms sql注入审计举例
首先查看用户登录位置,查看表单代码,发现数据传送给user.php文件。那么我们尝试在源码以及web前端当中分析该文件。
WEB界面展示:
很明显这是一个登陆界面,那么我们尝试输入信息,抓包看看具体的参数。在抓取数据包当中我们发现输入的变量有:user_name,pwd,safeconde,userful_time,from,act。结合我们输入的信息,很容易判定user_name表示用户名称,pwd表示密码,safecode表示验证码,useful_time我们猜测可能是时间戳。剩下的from,act暂时不清楚。
查看源代码user.php文件,通读全文我们了解到变量act的作用,代码根据cat参数不同的值来执行不同的SQL语句。所以,我们通过seay源代码审计系统来打开代码文件并且搜索“do_login”,来查看参数值为“do_login”时,执行什么样的sql语句。(注意:个人习惯我喜欢用nodepad++来查看,部分截图是使用nodepad++打开,不影响阅读)
由代码可以发现输入参数符合上面一系列if语句的判定之后会执行一个select语句。利用这个getone函数以及login函数来执行。很明显这是自定义函数。我们定位一下该函数来查看一下该函数是如何定义的。发现该getone函数是mysql.class.php文件当中类class自定义的一个成员函数。Login函数是文件user.fun.php当中定义的函数。下面我们来分析一下该函数:
A;getone函数调用了一个query函数来执行,并且将结果赋值给变量$query,且通过函数mysql_fetch_array函数处理赋值到变量$row,最后返回变量$row。
注释:mysql_fetch_array在结果集中取得一行作为数字数组或关联数组。MYSQL_ASSOC表示关联数组。
B;这里我们发现query函数依旧是一个自定义函数。定位函数来查看一下该函数。发现该函数依旧是在文件mysql_fetch_array当中。Query函数利用mysql_query来执行sql语句,并且返回。如果查询失败指定报错信息内容
C;login函数登陆函数。利用getone函数执行SQL语句。num=1
那么总结一下,getone函数作用:执行sql语句,控制报错信息,以关联数组形式返回值。(注意查询语句当中存在字符串“count(*)as num”会将查询结果转化。查询成功num=1,查询失败num=0)Login函数作用是带入用户名,密码进入数据库查询并且返回第一行查询结果且结果进行转化查询成功num=1,查询失败num=0。
到目前为止,我们可以分析一下数据流了。首先数据从前端上传到文件user.php文件当中,act=do_login位置代码。经过if语句进行基本判定然后执行sql语句,将数据上传到数据库。这里我们没有发现任何过滤的函数。看到这里我们很有理由怀疑该位置存在漏洞。值得注意的是,这里的login()函数首先判定用户名是否存在在执行用户名以及密码的联合查询。这里我的想法是验证用户名。那么我合法的注册一个就是咯。下面我们查看playload:
我这里注册了一个账号abc123/abc123
注入位置参数$pwd。‘)用来闭合md5加密。
Playload:abc123‘)or 1=1 #
注意:在我测试的过程中发现了一个很不愉快的事情。我发现这么注入没有任何效果。感觉像是单引号被干掉了。关于这个问题,我的思路是,采用var_dump来看看情况。下面是我处理该问题的思路:
使用var_dump来查看输出变量的值:
很明显这里的单引号被转义了。这个时候我们想过造成该转义的大多是使用函数addslashes(),通过搜索,我们发现在文件common.inc.php当中发现自定义函数deep_addslashes()
接着我查询什么文件包含了该文件。通过搜索发现在文件common.inc.php文件被调用且该文件也被user.php文件使用。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2021-3-7 16:40
被天象独行编辑
,原因: 原文件附件形式上传