《代码审计》阅读笔记
Published in:2022-12-23 | category: 网络安全

《代码审计》

备注: php代码审计
开始日期: December 23, 2022 5:09 PM
状态: 已完成

审计思路

  1. 根据敏感关键字回溯参数传递过程
  2. 查找可控变量,正向追踪变量传递过程
  3. 寻找敏感功能点,通读功能点代码
  4. 直接通读全文代码

一般流程:

  1. 拿到源代码文件夹,先从根目录开始,查找有没有敏感文件名,如:
  • index,API,include
  • 配置文件:config
  • 函数集文件:function,common
  • 安全过滤文件:filter,safe,check

然后再一层一层这样子通读一下文件名。

敏感函数:

1
2
addslashes()   #过滤函数,对单引号,双引号,NULL字符,以及斜杆进行转义过滤
mysql_real_escape_string #过滤函数,过滤\x00,\n,\r,\,',",\x1a

PHP配置

PHP_INI_*常量的定义

常量 含义
PHP_INI_USER 可在PHP脚本或windows注册表中设置
PHP_INI_PERDIR 可在php.ini,.htaccess或httpd,conf中设置
PHP_INI_SYSTEM 可在php.ini或httpd,conf中设置
PHP_INI_ALL 可在任何地方设置
php.ini only 仅可在php.ini中设置
  1. register_global(全局注册开关)

适用版本:php<5.4

该选项设置为on时,会直接把用户GET,POST等方式提交上来的参数直接注册成全局变量并初始化值为参数对应的值,如提交一个?a=xxx,则可以直接使用$a代替$_GET[a],

  1. allow_url_include(是否允许包含远程文件)

适用版本:php<5.2之后默认关闭

  1. magic_quotes_gpc与magic_quotes_gpc (皆为魔术引号自动过滤)

适用版本:php<5.4

自动过滤单引号,双引号,反斜杠和NULL,区别在于前者针对GET,POST,COOKIE;而后者针对从数据库或者文件中获取的数据进行过滤

  1. 安全模式

适用版本:php<5.4

漏洞挖掘

1.sql注入

  • 注意与数据库交互的函数,语句,然后查看他们的过滤情况

宽字节注入

关键字:

1
2
3
SET NAMES
character_set_client=gbk
mysql_set_charset

2.XSS

找带有参数的输出函数,然后根据输出函数对输入内容回溯输入参数

3.CSRF

token验证:token一般为访问上一个页面得到的,如果没有访问上一个页面而是通过跳转而来的,则验证失败

4.文件操作漏洞

文件包含:

1
2
3
4
include()
include_once()
require()
require_once()

本地文件包含:可以包含自己上传的文件,也可以包含本地的日志,如linux在User-Agent头写入木马,然后包含/proc/self/environ

远程文件包含:可以直接包含一个1含有木马的.txt。

通常会使用截断进行绕过

1
include $_GET[a].".php"

如:

  1. %00截断,php<5.3
  2. Windows下使用240个.或.加/,Linux下使用2038个./进行截断
  3. 远程包含时使用?进行绕过,?url=xxx.com/1.txt?

文件读取(下载)漏洞

1
2
3
4
5
6
7
8
9
10
11
12
#文件读取函数列表
file_get_contents()
highlight()
forpen()
readfile()
fread()
fgetss()
fgets()
parse_ini_file()
show_source()
file()
除了使用这些正常的读取文件的函数之外,还可以使用 include+伪协议 来读取文件

文件上传

1
move_uploaded_file() #唯一一个文件上传函数,所以在代码审计时可以直接查找这个函数,然后再看能不能绕过

文件删除

1
unlink()  #文件删除

变量覆盖漏洞

1
2
3
4
extract() #从数组中将变量导入到当前的符号表
parse_str() #将字符串解析成多个变量
import_request_variables() #php<5.4,全局变量注册
$$a #可变变量
Prev:
ctfshow-web入门-爆破
Next:
《Web漏洞搜索》阅读笔记