这是一个考虑比较全面的php和sql结合的防注入程序,在php方便主要对get,post,cooke,files进行了过滤,在sql中我们就对delete,update一些查询命令进行检测过滤。
-
SQL注入攻击的总体思路
-
发现SQL注入位置;
-
判断后台数据库类型;
-
确定XP_CMDSHELL可执行情况
-
发现WEB虚拟目录
-
上传ASP,php,jsp木马;
-
得到管理员权限;
贴代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
//PHP整站防注入程序,需要在公共文件中require_once本文件 //判断magic_quotes_gpc状态 if (@get_magic_quotes_gpc ()) { $_GET = sec ( $_GET ); $_POST = sec ( $_POST ); $_COOKIE = sec ( $_COOKIE ); $_FILES = sec ( $_FILES ); } $_SERVER = sec ( $_SERVER ); function sec(& $array ) { //如果是数组,遍历数组,递归调用 if ( is_array ( $array )) { foreach ( $array as $k => $v ) { $array [ $k ] = sec ( $v ); } } else if ( is_string ( $array )) { //使用addslashes函数来处理 $array = addslashes ( $array ); } else if ( is_numeric ( $array )) { $array = intval ( $array ); } return $array ; } |
1、整型参数的判断
当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
综合上面我们写一个整型过滤函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
function num_check( $id ) { if (! $id ) { die ( '参数不能为空!' ); } //是否为空的判断 else if (inject_check ( $id )) { die ( '非法参数' ); } //注入判断 else if (! is_numetic ( $id )) { die ( '非法参数' ); } //数字判断 $id = intval ( $id ); //整型化 return $id ; } //字符过滤函数 function str_check( $str ) { if (inject_check ( $str )) { die ( '非法参数' ); } //注入判断 $str = htmlspecialchars ( $str ); //转换html return $str ; } function search_check( $str ) { $str = str_replace ( "_" , "_" , $str ); //把"_"过滤掉 $str = str_replace ( "%" , "%" , $str ); //把"%"过滤掉 $str = htmlspecialchars ( $str ); //转换html return $str ; } //表单过滤函数 function post_check( $str , $min , $max ) { if (isset ( $min ) && strlen ( $str ) < $min ) { die ( '最少$min字节' ); } else if (isset ( $max ) && strlen ( $str ) > $max ) { die ( '最多$max字节' ); } return stripslashes_array ( $str ); } |
当输入的参数YY为字符串时,通常abc.php中SQL语句原貌大致如下:
select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.php?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='1', abc.php运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.php?p=YY&;nb ... 39;1'='2', abc.php运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//防注入函数 function inject_check( $sql_str ) { return eregi ( 'select|inert|update|delete|' |/*|*|../|./|UNION|into|load_file|outfile', $sql_str ); // 进行过滤,防注入 } function stripslashes_array(& $array ) { if ( is_array ( $array )) { foreach ( $array as $k => $v ) { $array [ $k ] = stripslashes_array ( $v ); } } else if ( is_string ( $array )) { $array = stripslashes ( $array ); } return $array ; } |