SQL注入漏洞
总体分为两种:数字注入 字符注入
当输入的参数为整型时,则可认为是数字型注入
比如:ID、年龄、页码等都可认为是数字型注入 不需要单引号来闭合
当输入的参数为字符串时,称之为字符型 需要单引号闭合
数字注入
使用seay源码审计工具 打开对应源代码 搜索select
id这里使用了变量进行传递 进一步跟踪变量
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
发现获取的变量并没有做任何过滤 直接带入了数据库 在浏览器上进行测试
字符注入
sql语句中 变量两边多了单引号 在测试的过程中 把引号闭合 获取信息
宽字节注入
%df%27===>(addslashes)====>%df%5c%27====>(GBK)====>運’ 用户输入===>过滤函数===>代码层的$sql==>mysql处理请求==>mysql中的sql
默认编码character_set_client==>根据character_set_connection转码==>更新数据库时转化成字段所对应的编码
function check_addslashes($string) { $string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); //escape any backslash $string = preg_replace('/\'/i', '\\\'', $string); //escape single quote with a backslash $string = preg_replace('/\"/', "\\\"", $string); //escape double quote with a backslash return $string; } 上述函数为过滤 ' \ 的函数 将 '转为 \' 将 \ 转为 \\ 将 " 转为 \"
当输入单引号闭合变量 代码中的函数把单引号进行转换
数据库设置了gbk 编码 添加%df 让单引号逃逸
mysql_query("SET NAMES gbk"); $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
代码执行漏洞
eval() 、assert()将输入的字符串参数作为PHP程序代码来执行
<?php if(isset($_GET['cmd'])){ $cmd = $_GET['cmd']; eval("\$cmd = $cmd"); } else{ echo "fail"; } ?>
也可以执行系统命令
<?php if(isset($_GET['cmd'])){ $cmd = $_GET['cmd']; assert("\$cmd = $cmd"); } else{ echo "fail"; } ?>
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] ) $callback 是要调用的自定义函数名称 $parameter 是自定义函数的参数
常见的回调函数:
call_user_func()、call_user_func_array()、array_map()等
<?php //function callBack(){ // $x = $_GET['x']; // eval($x); //} //call_user_func('callBack'); $b = 'phpinfo()'; call_user_func($_GET['a'],$b); ?>
动态执行函数
1. 定义一个函数
2. 将函数名(字符串)赋值给一个变量
3. 使用变量名代替函数名动态调用函数
<?php $_GET['a']($_GET['b']) ?>
preg_replace 函数
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) $pattern 正则匹配的内容 $replacement 用于替换的字符串或字符串数组 $subject 要进行搜索和替换的字符串或字符串数组 $pattern 存在/e模式修正符修饰 允许代码执行 <?php // 第一个参数 $cmd = $_GET['cmd']; $str = '<php>phpinfo()</php>'; preg_replace("/<php>(.*?)$cmd","\\1",$str); // 第二个参数 preg_replace("/php/e",$_GET['cmd'],"php"); // 第三个参数 $str = $_GET['cmd']; preg_replace("/\[php\](.*?)\[\/php\]/e","\\1",$str) ?>
命令执行漏洞
system函数
string system ( string $command [, int &$return_var ] ) $command 要执行的命令 $return_var 如果提供此参数,则外部命令执行后的返回状态将会被设置到此变量中
弹出计算器
<?php system($_GET['x']); ?>
passthru函数
string passthru ( string $command [, int &$return_var ] ) $command 要执行的命令 $return_var 如果提供此参数,Unix命令的返回状态会被记录到此参数 <?php $a = $_GET['x']; passthru($a); ?>
exec函数
string exec ( string $command [, array &$output [, int &$return_var ]] ) $command 要执行的命令 $output 如果提供此参数,会有命令执行的输出填充此数组 $return_var 如果同时提供$output和$return_var参数,命令执行后的返回状态会被写入到此变量 <?php $a = $_GET['x']; echo exec($a); ?> // 需要输出 并且只显示一行
shell_exec 函数
string shell_exec ( string $cmd ) $cmd 要执行的命令 反引号(`)则调用此函数 <?php $a = $_GET['x']; echo shell_exec($a); ?>