这是一个考虑比较全面的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
;
}
|