代码审计入门【建议收藏】

admin 2022年7月1日14:48:23评论59 views字数 5960阅读19分52秒阅读模式

1、常见的代码审计工具

1、Fortify SCA

2、Checkmarx CxSuite

3、360代码卫士

4、PHP代码审计工具——Rips

参考:https://www.jianshu.com/p/cd1cb66e4d7d

5、seay代码审计(常用)

参考:https://www.oschina.net/p/seay

6、SonarQube

参考:https://www.cnblogs.com/qiumingcheng/p/7253917.html

7、Cobra

参考:https://zhuanlan.zhihu.com/p/32363880

8、kiwi

参考:https://github.com/alpha1e0/kiwi


2、代码审计中常见的危险函数和字符串

参考:

https://wps2015.org/drops/drops/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E5%85%A5%E9%97%A8%E6%80%BB%E7%BB%93.html

0x01 整体

0x02 各种洞洞

a.文件操作漏洞

1.文件包含漏洞:

(1) 本地文件包含:
(2) 远程文件包含:
(3) 文件包含截断:

2.文件读取(下载)漏洞:

3.文件上传漏洞:

(1) 未过滤或本地过滤:服务器端未过滤,直接上传PHP格式的文件即可利用。

    (2) 黑名单扩展名过滤:

    (3) 文件头content-type验证绕过:

(4) 防范:

4.文件删除漏洞:

b.代码执行漏洞

1.代码执行函数:

(1)preg_replace()函数:

(2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…):
(3)eval()和assert():

2.动态函数执行:

3.命令执行函数:

(1)popenproc_open()

(2) 反引号命令执行:

c.变量覆盖漏洞

1.函数使用不当:

2.$$变量覆盖:

d.逻辑漏洞

1.等于与存在判断绕过:

(1) in_array(): 比较之前会自动转换类型(2)is_numeric():当传入参数为hex时 直接通过并返回true 并且MYSQL可以直接使用hex编码代替字符串明文 可以二次注入 并且可能造成XSS漏洞

(3)双等于==和三等于===

2.账户体系中的越权问题:

(1) 未exit/return/die:
(2) 支付漏洞

e.会话认证漏洞

  1. 找到传入sql语句的参数的传递过程 回溯变量到最原始的函数 看它保存在cookie的算法 是否可逆

  2. 和MD5比起 sha1更安全 解密sha1的网站更少

  3. 限制一个用户只能同时在一个IP上登录

f.二次漏洞

1.类型:

2.技巧:

(1) 钻GPC等转义的空子:
  GBK的宽字节注入
(2)字符串问题:

2 常见的危险函数和审计点

1、RIPS审计工具的下载,安装,使用

2、PHP常见的部分危险函数解析

2.1 PHP代码执行函数

a.eval()

b.assert()

c.create_function()

2.2 PHP包含函数

常见的包含函数:require,include,require_once,include_once

include $file 中,如果变量 $file 可控,则就可以包含任意文件。

此外,根据不同的配置环境,可以包含不同的文件:远程文件和本地文件。

包含函数还可以通过支持的协议和封装协议以及 过滤器读取任意文件内容。

例子,如

利用php流filter读取任意文件

include($_GET('file');

// ?file=php://filter/convert.base64-encode/resource=index.php

上面的代码中,就通过filter读取index.php的内容,并将内容编码成base64再输出。

2.3命令执行函数

常见的命令执行函数有:

* exec() -- 执行一个外部程序

* passthru() -- 执行外部程序并显示原始输出

* proc_exec() -- 通过shell环境执行命令,并且将完整的输出以字符串的方法返回

* system() -- 执行外部程序,并且显示输出

* popen() -- 通过popen()的参数传递一条命令,并对popen()所打开的文件进行执行。

2.4 文件操作函数常见的任意文件读取,写入,删除往往是下面几个函数受到了控制.

copy() -- 拷贝文件

file_get_contents() -- 将整个文件读入一个字符串

file_put_contents() -- 将一个字符串写入文件

file() -- 将整个文件读入一个数组中

fopen() -- 打开文件或者URL

move_uploaded_file() -- 将上传的文件移动到新位置

readfile() -- 读取文件

rename() --重命名文件或者目录

rmdir() -- 删除目录

unlink() & delete() -- 删除文件

 

详细参考链接:https://www.zybuluo.com/Dukebf/note/715934

https://www.bbsmax.com/A/pRdB8DR6Jn/

3 代码审计实战之SQL注入漏洞

1.基本技巧

sql注入漏洞通常有两种利用方式。一种是权限较大,直接写入webshell,另外一种是权限较小,但是可以读取用户账号密码,比如读取管理员账号密码,登录后台管理。

sql注入经常出现在登录页面http请求中的user-agent,client-ip,x-forward-for等可能会被程序存储到数据库中的地方。另外,在订单处理的地方,由于业务逻辑复杂,经常会有二次注入漏洞。

至于在白盒审计中,若想定向挖掘sql注入漏洞,只需要注意这几个数据库操作关键字:select from , mysql_connect , mysql_query , mysql_fetch_now , update , insert , delete ; 查到这些关键字后,定向追踪他们,就可以审计sql注入漏洞

 

代码审计入门【建议收藏】

代码审计入门【建议收藏】

2.编码注入

程序在进行一些操作之前,经常会进行一些编码处理,通过输入一些编码函数不兼容的特殊字符,可以导致输出的字符变成有害数据。其中最常见的编码注入就是mysql的宽字节注入以及urldecode/rawurldecode这两个函数。

宽字节注入

怎么说呢,这个漏洞以前研究过,但是总是没研究透。个人感觉,只要是set character_set_client='gbk'或者set NAMES 'gbk',那么就可能存在漏洞。至于原理虽然无法搞的十分清楚,但是可以直接手工测试。看能否吃的掉转义字符。

解决这个漏洞的方法:

第一种方法,set NAMES 'gbk' 之后,在 set character_set_client=binary就可以了。

第二种方法,使用pdo方式,在php5.3.6及以下版本设置 setAttribute(PDO::ATTR_EMULATE_PREPARES,false);来禁用prepared statements的仿真效果。

综上所述,要想看代码中是否有宽字节注入,那么搜索几个关键字:

SET NAMES

character_set_client

mysql_set_charset('gbk')

 

二次urldecode注入

如果目标网站开启了GPC,并且用了urldecode或者rawurldecode函数,那么通过二次解码,第二次就会解析出单引号,导致注入。

 

因此,在代码审计中,可以通过搜索urldecode和rawurldecode来挖掘二次注入漏洞。

常见的注入点:

  • 输入

  • HTTP头

  • user-agent

  • client-ip

  • x-forward-for

  • 数据库操作关键字

  • select/update/insert/delete

  • mysql_connect

  • mysql_query

  • mysql_fetch_row

编码注入

sql注入预防方法

通常,程序要么被动获取参数,比如get,post;要么主动读取文件或者远程页面;因此,过滤好这两条路,就可以防止sql注入。

在PHP的核心配置中,magic_quotes_gpc负责对get,post,cookie的值进行过滤,magic_quotes_runtime对从数据库中或者文件中获取的数据进行过滤。

但是,上面两种方法只能过滤部分sql注入,因为他们只是转义了单引号,双引号,反斜杠,空字符null,对int注入没什么用。因为int类型可以直接接sql语句,不需要闭合。

 

addslashes函数

这个函数对参数中的单引号,双引号,反斜线,空字符进行过滤。但是有的程序员在开发的时候,没有考虑到get请求中可能存在数组(这个函数是对字符串进行过滤),导致了绕过。

说实话,get请求中带数组是怎么带的?这个我还真比较懵。估计得完整开发一个网站之后,才能知道get请求中带数组是怎么回事?

mysql_rel_escape_string($str,$con)

这个函数也是过滤,第一个参数是字符串,第二个参数可选,是数据库连接,若没有设置第二个参数,那就默认为上一次连接的数据库。

这个函数主要过滤的是:x00,n,r,,',",x1a

但是,这里的x00和x1a我不太懂是什么意思。

intval()函数

前面的函数针对的是字符型注入,对Int型注入效果不是太好。因此,这个intval()函数就是以白名单的思想,对数据进行过滤。

4 代码审计实战之任意文件上传

1、代码审计之文件上传漏洞危险函数的绕过姿势

A.move_uploaded_file() 接着看调用这个函数的代码是否存在为限制上传格式或者可以绕过。

B.getimagesize函数验证:只要在文件头添加GIF89a即可;

C文件头content-type验证绕过:验证$_FILES[“file”][“type”]的值,这个是可控的。

D.函数误用导致上传绕过

以iconv()函数为例,在iconv转码的过程中,utf->gb2312(其他部分编码之间转换同样存在这个问题)会导致字符串被截断,如:$filename=”shell.php(hex).jpg”;(hex为0x80-0x99),经过iconv转码后会变成$filename=”shell.php “。

E.竞争上传,主要涉及到的为copy函数。

2、文件上传漏洞审计流程

  1. 审计函数

  2. move_uploaded_file()

  3. 定义和用法:

  4. move_uploaded_file() 函数将上传的文件移动到新位置。

  5. 若成功,则返回 true,否则返回 false。

  6. 语法:

  7. move_uploaded_file(file,newloc)

  8. 超全局变量 $_FILES

  9. 后缀名是图片格式

  10. 前缀名不能是外部提交的

  11. 上传的目录不可以是获取外部提交的路径

3、代码举例分析

文件上传首先需要一个表单,如下,我们把它叫做a.html

<form action="t.php" method="post" enctype="multipart/form-data"><input name="aaa" type="file" /><input type="submit" /></form>

这里有几个要素:

  • action属性是提交的目标。

  • method属性是提交所用的HTTP方法,常用的就是 POST 和 GET,文件上传一般用 POST。

  • enctype属性必须要写成这样,因为文件上传和普通的提交具有不同的编码方式。如果不写的话,可能会被当做urlencoded,就是k1=v1&k2=v2的键值对形式,导致解析不出东西。

  • 最后是文件输入框,它的name属性非常重要,它是PHP脚本中寻找文件的关键字。

接下来是PHP脚本中的东西,PHP中通过$_FILES对象来读取文件,通过下列几个属性:

  • $_FILES

    ['name'] - 被上传文件的名称。

  • $_FILES

    ['type'] - 被上传文件的类型。

  • $_FILES

    ['size'] - 被上传文件的大小(字节)。

  • $_FILES

    ['tmp_name'] - 被上传文件在服务器保存的路径,通常位于临时目录中。

  • $_FILES

    ['error'] - 错误代码,0为无错误,其它都是有错误。

t.php中的代码写成这样:

<?phpif(!isset($_FILES['aaa'])) {
echo 'file not found';
exit();}

var_dump($_FILES['aaa'])

可以看到那个aaa就是文件输入框中的name属性。

我们把这两个文件放到服务器的目录中,或者直接在目录下启动PHP自带的服务器。之后打开a.html随便传上去一个文件,会得到这样的结果,这里我直接上传了a.html

array(5) { 
["name"]=> string(6) "a.html"
["type"]=> string(9) "text/html"
["tmp_name"]=> string(44) "C:UsersasusAppDataLocalTempphp43A1.tmp"
["error"]=> int(0)
["size"]=> int(133)
}

需要说的是,在处理文件上传的时候,不应信任文件类型type,因为类型在浏览器生成之后,是可以改的。甚至可以手动构造出于类型与实际内容不匹配的数据包。

同时也不应该信任文件名称name。而是应该分离文件名与扩展名,对扩展名进行白名单过滤。文件名按需舍弃重新生成,或者过滤后再使用。

5 PHP反序列化漏洞代码审计

1、什么是序列化

A、PHP网站的定义:

B、PHP反序列化

2、理解PHP反序列化漏洞

3、PHP反序列化漏洞利用的前提

a.unserialize()函数的参数可控;

b.php文件中存在可利用的类,类中有魔术方法

4、PHP反序列化漏洞—发现技巧

5、PHP反序列化漏洞—构造exploit思路

6、案例分析

https://www.cnblogs.com/xiaozi/p/7839256.html

https://www.grt1st.cn/posts/php-unserialize-analysis/


作者:klsfct

原文链接:https://www.cnblogs.com/klsfct/p/11192581.html


代码审计入门【建议收藏】

好文推荐

代码审计入门【建议收藏】

工具|红队快速批量打点

实战 | App优惠劵无限领取漏洞挖掘记录

利用 EHole 进行红队快速批量打点

神兵利器 - presshell

渗透测试-Ngrok内网映射与穿透

分享 | 几种实战成功过的webshell免杀方式

推荐一款自动向hackerone发送漏洞报告的扫描器

李姐姐开源DNSLog工具eyes.sh


欢迎关注 系统安全运维

原文始发于微信公众号(系统安全运维):代码审计入门【建议收藏】

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月1日14:48:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   代码审计入门【建议收藏】https://cn-sec.com/archives/1129034.html

发表评论

匿名网友 填写信息