代码审计--最常见的漏洞审计篇
前言
以下内容仅供技术研究学习使用!严禁用于非法操作!
正文
xss漏洞

看到这里有个公司名称,看看有没有xss,放入审计工具看一下

很明显是第二个(因为我是在安装路径里面)

可以看到这里面他申请了一个数组,应为是下标为公司名称的在看看前面的$lang->install,按经验来看这应是是一个实例化的类,按照正常思路我们往前面翻一番看看有什么

他这里果然是一个实例化的类,去找一找这个类,找了半天没找到,感觉很奇怪,我就直接找这个

变量了

看看哪里输出了这个变量

可以看到这里他直接输出了,及有可能存在xss,试试看

保存

成功弹窗,而且这是个存储型的xss,写入数据库了。
文件上传
一:
登录,发现上传点,先上传一个php文件看看(由于是php建站)

有检测,我们用这个提示框里面的内容去源码搜下。

发现文件,点进去看看。

他这里用in_array函数进行的判断,往上翻看看,

好东西,黑名单过滤,不急先看看代码怎么运行的,这里他实例化的一个类($upload = new UploadFile();)看看这个类。



定义了一些函数,和变量,然后往回看,禁了那些后缀名

'asa','asp', 'aspx', 'cdx','ascx', 'vbs', 'ascx', 'jsp', 'ashx', 'js', 'reg', 'cgi','html', 'htm','shtml', 'cfm', 'cfc', 'pl', 'bat', 'exe', 'com', 'dll', 'htaccess', 'cer', 'php5', 'php4', 'php3', 'php2', 'php', 'pht', 'phtm'
可以看到的这是黑名单,但是有黑名单,还不一定有漏洞,一般黑名单过滤是有好几层筛选的,我们接着往下看

他设置了附件上传目录和仅上传单文件,这些都不是,关键是代码调用了UploadFile()类的upload函数,我们跳过去看看。


他这里就简单的检测了一下,但是他调用了一个check函数来自动检查附件

我们搜索看下

他这里对大小,mime类型,文件类型,和是否合法进行的检测,其他几个都好绕过,我们就直接看这个文件类型的,发现他又调用了一个checkExt函数,去看看。

这个函数检查了上传的文件类型是否合法,就是检测了后缀名了。可以看到这个可以绕过的,他并没有转变成小写,可以大写绕过,到此这边结束了,我们再跳回前面去看看,

可以看到他对来自$info的后缀再次检测,我们看到$info从getUploadFileInfo()来的,去看看。

return了uploadFileInfo(上传成功的文件信息)。

后面就用in_array再一次过滤了。

到这里就过滤完了,从上面可以知道,这个文件上传漏洞他是黑名单过滤,他过滤了asa','asp', 'aspx', 'cdx','ascx', 'vbs', 'ascx', 'jsp', 'ashx', 'js', 'reg', 'cgi','html', 'htm','shtml', 'cfm', 'cfc', 'pl', 'bat', 'exe', 'com', 'dll', 'htaccess', 'cer', 'php5', 'php4', 'php3', 'php2', 'php', 'pht', 'phtm'。我们只要上传PHP格式的文件就可以绕过。

点击上传,木马的jpg文件

burp抓包改包

上传成功

二:
常规思路寻找上传点

找到上传点,接下来就是找他所对应的源码位置在哪里,还是老方法,通过报错找


太多了快一百个了,这一个个找要很久,换个思路,上传一个正常的看他提示了啥,后来发现没提示,这就麻烦了找不到,后来想一想可以从前端源代码里面看他调用了什么函数

有了,去找找看

找到了


可以看到他调用了两个函数先看第一个


这个有点迷糊,网上找了很多资料,我猜可能是调用loadModel方法时传递了一个非空的appName,会导致错误。
所以调用父类的loadModel方法来避免这个错误。

好了我们再看第二个函数


可以看到他有调用了getupload函数,追踪看看


取关键函数来看,可以看到他声明了一个空的数组给$file然后再用is_array()来判断是否上传文件名是否存在,再用extract和foreach函数来赋值键值和循环赋和值给$di与$filename,最后我们就直接看这个赋值后缀名的函数getExtension

他这里进行了两次过滤,一次黑名单一次白名单我们搜一下两个的黑白名单分别为什么



可以看到这几乎不太可能绕过的,我就试着先常规绕过看看


这里再后缀名改成php后再加一个点或者直接加一个点,都能绕过,我就纳闷了,复制路径看了一下

后缀名为空,但是却能执行,这。。。。。。。把我给整傻了,后来我再去分析了一下,发现了两个原因

原因一:

他这里是逻辑有问题,只要我们在第一个if的时候判断后缀名为空(因为是与逻辑一个为假就都为假)就可以绕过后面的三个if判断了这样就绕过黑白名单和强制后缀名判断php了。

原因二:

对于没有后缀名但是能强制解析成php很可能是有开始 .htacess(应该是安装建站系统的时候就会默认存在的)

.htacess:网上对这个的解释是taccess文件(或者"分布式配置文件"), 全称是Hypertext Access(超文本入口),负责相关目录下的网页配置, 了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一个或多个指令的文件, 作用于此目录及其所有子目录, 通过.htaccess文件可以实现网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能,嗯,大概意思就是会把没有后缀名的或者其他后缀名的都解析成php格式,
SQL注入
拿到源码,我们可以本地搭建,进入后台看看有什么可能存在漏洞功能块。

我们可以看到里面有一些功能,里面有一个sql的写入框,有问题看看有没有过滤,我们随便输入东西看一看

看来存在过滤

不过我们有源码,通过报错信息里有一个非法操作,放到工具里面源码审计系统搜搜看

发现里面1到17个都有感叹号,说明这个程序运行是在最后一个里面,发现后面两个都是在同一个php文件里面,我们先看第一个

后来发现最后面两个搜索结果都是同一个地方,可能是搜索结果出现问题了

回到正题,通过这个搜索我们还不能判断是否程序运行在这里,我们再看看里面的参数有title,limits,orders,isall,sqls等等,他们都是通过frparam函数将这些参数里面的具体内容传递给$data这个数组里面,既然是参数可以肯定在抓包的时候会出现,我们就抓个包试试

在前面那个功能块里面点击保存,并抓包


我们可以看到里面的参数和我们源码里面看到的参数一样且sql的输入框框是sqls这个参数,基本可以肯定是这里了

接下来就是代码审计了

我们可以看到他做了一个if判断,通过frparam函数的运行结果是否等于1,我们看看frparam函数,这个函数一看就是自定义的,对于自定义的函数肯定有function frparam这个函数声明,我们去搜一搜。

找到了,点进去看看

可以看到它是获取URl的参数值,通过前面调用这个函数,他已经go和1传过来了,所以这里的$str和$int为go和1。

这里$data = $this->_data;意思是把前端的所有数据传过来,这时候再判断$str是否为空,再通过这个array_key_exists函数判断$str是否在不在$data里面,显然都不满足,所以跳过,后面他在$method变量判断,显然是为空的,因为我们没有赋值给他就默认了,然后把 $data[$str]赋值给$value了,最后再return format_param($value,$int,$default);看一看format_param函数。


这里他参数过滤,格式化了,通过前面传来的int=1,我们直接跳到case 1:,里面他通过SafeFilter函数进行了过滤,我们定位看看


可以看到他里面过滤了xss攻击了,简单看了一下,是过滤xss的,顺便看下这个框框有没有xss漏洞,通过 $arr = preg_replace($ra,'',$arr)这个函数判断$arr有没有在$ra里面,有就替换成空了,看到$ra里面就过滤了一些基本的js语句,可能会有,然后再接着看下去,就回到前面了。

可以看到他又把传来的$值给html实体了。。。没戏。

不慌,我们接着看下去。

可以看到他判断php版本了,大于等于7.4就会通过addslashes函数在每个双引号"前添加反斜杠,然后再return $value,如果没有大于等于,就会判断是否开启魔术方法了,没有就会和上面一样,通过addslashes函数在每个双引号"前添加反斜杠,然后再return $value,说到这我只能说这代码写的真严谨。。。

好了,这里看完了,回到前面。

这里return的值就是层层过滤后的$value的值了,这里运行结束,然后我们再返回去看前面。

好了,一个frparam函数终于看完了,后面好多个都是通过这个frparam层层筛选的和前面一样,就不多说,我们再往下看。


(太长了,截两张)这里他对这个sqls参数进行了stripos函数判断,这个stripos函数是查找我们指定的字符在字符串中第一次出现的位置,如果有就会输出位置也就是不等于false,也就是为真了,代码里他通过多次或逻辑,只要有一个为真就会执行if里面的”非法操作“这个代码,所以我们只要绕过这些判断,也就是全为假,可以看到他对update,delete,insert,drop,truncate进行了对比,我们只要不适用这些函数就OK了。

看到我箭头画的就是执行顺序了,他直接就带入执行了,说明存在漏洞。

我们只要的插入sql语句的时候不要有上的敏感字符就可以了,payload我相信大家都会写,我就不废话了,就直接放sqlmap跑了。

点击收藏 | 3 关注 | 4
登录 后跟帖