2

漏洞挖掘与防范

SQL注入漏洞

1.搜索关键字如select from、update、insert、deletemysql_connectmysql_querymysql_fetch_now等关键字可定向挖掘SQL注入漏洞。

宽字节注入

2.urlencode、urldecode、rawurlencode、rawurldecode区别。使用不当可导致宽字节注入。
除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。
urlencoderawurlencode的区别:
1)urlencode 将空格则编码为加号(+)
2)rawurlencode 将空格则编码为加号(%20)
payload:

.../1.php?id=1df%' union select 1,database()#
'单引号自动转义在前面加了/'---经过urlencode洗礼后也就是5c%
如果php连接数据库的时候设置了set character_set_client=gbk,就是告诉mysql服务器 客户端 数据来源是GBK格式
这时df%5c%会被decode成一个汉字。

宽字节注入搜索关键字SET NAMES、character_set_client=gbk、mysql_set_charset('gbk')

二次urldecode注入

payload:%2527
%25进行解码后为%         再次解码%27结果为'(单引号)

原理是当某处使用了urldecode()或者rawurldecode()函数,当我们提交参数到WebServer的时候。WebServer会自动解码一次。然后在经过函数的二次解码。生成单引号引发注入。
可以搜索这两个函数的关键词进行定位。

防范措施--函数

gpc和addslashes

如果magic_quotes_gpc=On(php6以上没有此选项)
PHP解析器就会自动为post、get、cookie过来的数据增加转义字符,和函数addslashes功能差不多

mysql_[real_]escape_string函数

(php4.0.3版本以上才存在)
作用是转义特殊字符,包括:

\x00
\n
\r
\
'
"
\x1a

intval(将变量转换为int类型)--主要是利用参数白名单

PDO prepare预编译

函数

文件上传

move_uploaded_file($temp_file, $img_path)
trim($file_name)#移除字符串两侧的空白字符或其他预定义字符
strrchr($file_name, '.')#返回'.'在$file_name最后出现的位置到$file_name字符串末尾这一段字符串
strtolower($name)#转换为小写
str_ireplace('a','',$name)#将$name中的'a'/'A'(不区分大小写)替换成''(也就是删除)
in_array($name,$array)#查询$name是否在$array中
substr($string,$start,$length)#$start(0,-1),均是从左往右
strrpos($name,'.')#返回'.'在$name字符串中最后出现的位置(从0开始)

fopen($filename, "rb")#打开$filename二进制只读模式
fread($filbit,2)#只读两个字节
unpack("C2chars", $bin)#将字节转化为字节二进制的数组
intval($strInfo['chars1'].$strInfo['chars2'])#intval函数作用是提取整数(参数包括字符串和整数)

getimagesize($filename)#检测图片类型,返回数组。不是绝对安全,可绕过
image_type_to_extension('int')#返回后缀名,参数范围可参照getimagesize函数返回结果索引3
stripos($name,'.')#返回'.'在$name字符串中首次出现的位置(从0开始)

#获取文件名后缀:
第一种方法:
strtolower(substr($_FILES[$n]["name"],strrpos($_FILES[$n]["name"],'.')+1))
第二种方法:
$uptype = explode(".",$_FILES["file"]["name"]);//获取扩展名
$kuozm=strtolower(end($uptype));

秋名山车神
40 声望2 粉丝