MYSQL Injection IDS [ver.1.0][Updated]

Write by admin in web安全架构,web应用程序安全 at 2008-07-14 10:12:55

/*

MYSQL Injection IDS [ver.1.0]

BY 80sec http://www.80sec.com/

函数严格限制SQL文里出现

###########################################
union查询
select子查询
不常用的注释
文件操作
benchmark等危险函数
###########################################

原始地址: http://www.80sec.com/release/Mysql-injection-ids-1.0.txt

本函数适合一些开放代码的程序(因为这些程序需要考虑到在各种版本的Mysql里运行),但是可能并不适合在你的程序里,你可以通过修改自己的程序或者做合适的配置来适应它另外对于正常的SQL语句,由于本程序使用的是操作相对来说比较快的strpos来实现的,所以效率影响不是很大:)

关于使用:
1 本函数是在MYSQL操作层来检测非法的SQL查询,大部分情况下该查询是由入侵者引起的,您可能也需要调整自己的程序,本程序不能作为过滤函数
2 本函数需要部署在mysql_query函数前面,作为检测即将执行的SQL语句,最好将他部署在你的MYSQL操作类的前面
3 非法操作默认记录在根目录下,名字为站点根目录的md5值

任何建议与部署上的问题欢迎与

root#80sec.com

联系

:)

*/


function check_sql($db_string){

$clean = '';
$error='';
$old_pos = 0;
$pos = -1;
$log_file=$_SERVER['DOCUMENT_ROOT'].md5($_SERVER['DOCUMENT_ROOT']).".php";

while (true)
{
$pos = strpos($db_string, '\'', $pos + 1);
if ($pos === false)
break;
$clean .= substr($db_string, $old_pos, $pos - $old_pos);

while (true)
{
$pos1 = strpos($db_string, '\'', $pos + 1);
$pos2 = strpos($db_string, '\\', $pos + 1);
if ($pos1 === false)
break;
elseif ($pos2 == false || $pos2 > $pos1)
{
$pos = $pos1;
break;
}

$pos = $pos2 + 1;
}
$clean .= '$s$';

$old_pos = $pos + 1;
}

$clean .= substr($db_string, $old_pos);

$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));

//老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它
if (strpos($clean, 'union') !== false && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0){
$fail = true;
$error="union detect";
}
//发布版本的程序可能比较少包括--,#这样的注释,但是黑客经常使用它们
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== false || strpos($clean, '#') !== false){
$fail = true;
$error="comment detect";
}
//这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库
elseif (strpos($clean, 'sleep') !== false && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0){
$fail = true;
$error="slown down detect";
}
elseif (strpos($clean, 'benchmark') !== false && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0){
$fail = true;
$error="slown down detect";
}
elseif (strpos($clean, 'load_file') !== false && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s', $clean) != 0){
$fail = true;
$error="file fun detect";
}
elseif (strpos($clean, 'into outfile') !== false && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s', $clean) != 0){
$fail = true;
$error="file fun detect";
}
//老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息
elseif (preg_match('~\([^)]*?select~s', $clean) != 0){
$fail = true;
$error="sub select detect";
}

if (!empty($fail))
{

fputs(fopen($log_file,'a+'),"<?php die();?>||$db_string||$error\r\n");
die("Hacking Detect<br><a href=http://www.80sec.com/>http://www.80sec.com");
}

else {
return $db_string;
}
}

/*
$sql="select * from news where id='".$_GET[id]."'"; //程序功能的SQL语句,有用户数据进入,可能存在SQL注射

check_sql($sql); //用我们的函数检查SQL语句

mysql_query($sql); //安全的数据库执行
*/

本站内容均为原创,转载请务必保留署名与链接!
MYSQL Injection IDS [ver.1.0][Updated]:http://www.80sec.com/mysql-injection-ids-ver10.html

7 条评论

  1. 评论 by kj021320

    不如做成轮循的方式!检查数据库SQLPOOL,及时报警,这样更有经济效益!
    别人做好的系统!再插入你这个! 不容易啊….

  2. 评论 by admin

    @kj021320

    我觉得没有一个系统可以适合所有系统,我这个用在一些自己开发自己使用的一些小站点和一些开源程序上还不错 :)
    关键是部署上比较麻烦点,但是更改下还是可以用在其他系统里的

  3. 评论 by keylee

    我现在在做个小东西,不知道老大可不可以帮忙用PHP写个过滤自定义CSS(比如百度空间那种)中危险字符的东西,我不胜感激。

  4. 评论 by admin

    @keylee

    是有这个想法的,可以与我联系 :)

  5. 评论 by admins

    请问mysql3.0这么inject
    例如www.site.com/a.php?id=1

  6. 评论 by admins

    小于4.0的不支持union请问怎么查询 谢谢
    例如www.site.com/a.php?id=1

  7. 评论 by admin

    mysql3.0可能比较有难度,不支持union也不支持子查询,不过权限高的话可以尝试load_file数据库文件

    :P

留下评论

(必填)

(必填)