PHP - 简单代码审计
翻网盘的时候翻到了一堆 代挂网站源码
,大概是以前和别人合作的时候别人给的参考网站,现在对其中部分代码进行一次简单的代码审计,本次主要审计外部变量造成的SQL注入,运行环境版本为 PHP5
程序代码给出下载:
PHP的外部变量
变量名 | 说明 |
---|---|
$_SERVER | 记录服务器信息 |
$_POST | 记录请求表单 |
$_GET | 记录请求GET参数 |
$_COOKIE | 记录请求的Cookies |
代码审计
一般来说,对于源代码中的外部变量遵循一个铁则:
永远不要相信用户的输入
本次利用 NotePad++
对代码进行搜索并分析上下文来确定是否包含SQL注入。
搜索变量
审计过程
一般来说,比较简单的PHP网站,一个PHP文件一个页面,没有使用框架,就基本上不会对外部变量进行过滤,从代码来看,代码的作者至少有3位:
转义函数
1 | function safestr($str){ |
说明
addslashes
() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
- 单引号(’)
- 双引号(”)
- 反斜杠(\)
- NULL
默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes
(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
可以看到这里对输入的字符串进行一次过滤,使用的地方如:
/find.php:1~6
1
2
3
4
5
6 <?php
require_once('includes/common.php');
if($_POST['do']=='find'){
session_start();
$user=safestr($_POST['user']);
$aqanswer=safestr($_POST['aqanswer']);
但是也有未使用的地方(此管理目录,虽然有注入点,但是需要管理员权限才可运行):
/admin/addfz.php:13~15
1
2
3 $d_qq = $_POST['d_qq'];
$d_user_name = $_POST['d_user_name'];
$d_user_pwd = $_POST['d_user_pwd'];
安全检测
此份代码里包含了安全检测部分,检测输入变量是否包含恶意字符:
/includes/360_safe3.php
部分代码
1 | ... |
审计结果
从代码静态审计来看,注入点比较多,例如:
/mgmt/qd.php:17 注入参数: POST:uin
1
2
3 $qq=$_POST['uin'];
...
if (!$qqrow=$db->get_row("select * from {$prefix}qqs where qq='$qq' and uid='$userrow[uid]' limit 1")) {
可用注入
/includes/common.php:77 注入参数:COOKIE:tgyd_sid 可用
1
2
3
4
5
6
7
8
9
10
$cookiesid = $_COOKIE['tgyd_sid'];
if ($cookiesid && $userrow = $db->get_row("select * from {$prefix}users where sid ='$cookiesid' limit 1")) {
C('loginuser', $userrow['user']);
C('loginuid', $userrow['uid']);
}
POST 实列
1 | GET http://qq.atd3.org/includes/common.php HTTP/1.1 |
注入日志
1 | 180718 12:32:12 16 Connect root@localhost on |