在源代码审计的过程中,经常会遇到各种过滤函数,了解这些函数并知道fuzz就能更好的完成组合拳,以PHP为引,抛砖引玉。
0x00 intval()
function:
此函数主要用于将变量强转为向下取整的整型数字
example:
xxxxx -> 0
2xxxx -> 2
2.044 -> 2
0.555 -> 0
5e10 -> 5 //科学计数法
32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。
0x01 is_numeric()
function:
判断变量是否为数字或数字字符串,不仅检查10进制,16进制是可以。
example:
返回的是BOOL值
1111 -> true/1
sdkl -> false/NULL
44jk -> false/NULL
0x12 -> true/1 //十六进制,0x276f722731273d2731='or'1'='1 绕过SQL注入
5e10 -> true/1
%20%20%2044 -> true/1 //忽略空格
2044%20 -> false/NULL //放在末尾为false
%002044 -> false/NULL //%00 出现就是false
在线十六进制转换:https://www.bejson.com/convert/ox2str/
0x02 htmlspecialchars()
function:
这个函数大家都很熟悉,用于放置XSS,转义
&转成&
"转成"
'转成' //发现并不转义 当htmlspecialchars($username)
<转成<
>转成>
注意 ‘ 不转义,此函数并不能防止SQL注入
0x03 addslashes()
单双引号、反斜线及NULL加上反斜线转义
被改的字符包括单引号 '
、双引号"
、反斜线 backslash \
, 以及空字符 NULL
。/
不转换
0x04 mysql_real_escape_string()
转义SQL字符串中的特殊字符
转义 \x00
\n
\r
空格
\
'
"
\x1a
,针对多字节字符处理很有效。mysql_real_escape_string
会判断字符集,mysql_escape_string
则不用考虑。
0x05 parse_url()
本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。
reference:
http://php.net/manual/zh/function.parse-url.php
绕过的方式用多个/////
原因:对严重不合格的 URL, parse_url()
可能会返回 FALSE
并发出 E_WARNING
0x06 sha1()
sha1()
函数计算字符串的 SHA-1
散列
reference:
http://www.w3school.com.cn/php/func_string_sha1.asp
sha1()
不能处理数组,当为数组的时候返回bool(false)
0x07 md5()
md5()
函数计算字符串的 MD5 散列
refernece:
http://www.w3school.com.cn/php/func_string_md5.asp
md5(,true)
时返回 原始 16 字符二进制格式
md5(ffifdyop,true)
返回 'or'6�]��!r,��b
也就造成了md5注入
当传入的参数时数组的时候,和上述的sha1()
一样的返回false
0x08 strpos()
strpos()
函数查找字符串在另一字符串中第一次出现的位置。
注释:strpos()
函数对大小写敏感。
这一点常在CTF中考到
stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)
reference: http://www.w3school.com.cn/php/func_string_strpos.asp
0x09 ereg()
可以使用%00
截断正则匹配
ereg()
与 eregi()
不同之处
<?php if (ereg("C","abcdef")){ echo "通过"; }else{ echo "错误"; } ?> //返回结果是:错误 大小写敏感 <?php if (eregi("C","abcdef")){ echo "通过"; }else{ echo "错误"; } ?> //返回结果是:通过 大小写不敏感 ?>
0x10 str_replace()
正则匹配,只替换一次是一个考点
echo str_replace("select","","SQL 注入语句: select user,pass from users #"); 输出:SQL 注入语句: user,pass from users # echo str_replace("select","","SQL 注入语句: selselectect user,pass from users #"); 输出:SQL 注入语句: select user,pass from users #
reference:
http://www.w3school.com.cn/php/func_string_str_replace.asp
0x11 strcmp()
比较两个字符串
int strcmp ( string $str1 , string $str2 )
参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
传参数为数组类型可绕过
0x99 测试时的index.php源码
<?php //测试 $id = isset($_GET['id'])?$_GET['id']:0; $username = isset($_GET['username'])?$_GET['username']:NULL; $passwd = isset($_GET['passwd'])?$_GET['passwd']:NULL; echo "获取变量:".$id."<br/>".$username."<br/>".$passwd."<br/>"; //intval() echo intval($id)."<br/>"; //is_numeric() echo is_numeric($id)."<br/>"; var_dump(is_numeric($id)); echo "<br/>"; //htmlspecialchars() var_dump(htmlspecialchars($username)); echo "<br/>"; //addslashes() var_dump(addslashes($username)); echo "<br/>"; //mysql_real_escape_string() var_dump(mysql_real_escape_string($passwd)); echo "<br/>"; //sha1() if(sha1($username) === sha1($passwd)){ echo "sha1 success!"; } else{ echo "sha1 error!"; } echo "<br/>"; //md5() echo md5($id)."<br/>"; echo md5($id,true)."<br/>"; if(md5($username) === md5($passwd)){ echo "md5 success!"; } else{ echo "md5 error!"; } echo "<br/>"; //str_replace() echo str_replace("select","","SQL 注入语句: selselectect user,pass from users #"); ?>
版权声明:《 PHP的常见及过滤函数探究 》为DYBOY原创文章,转载请注明出处!
最后编辑:2018-6-23 15:06:41
提示:本文章评论功能已关闭