代码审计补充知识点

简介: 参考文献:https://hacksec.xyz/2018/03/23/php-trick/?nsukey=cWDNgiIxMsJayPNWtqM8Rc9amSOIgC0SI9Ko3jxxW2uV9mcoLNLdl4Q1U%2BrV9UhKIs3das...

参考文献:https://hacksec.xyz/2018/03/23/php-trick/?nsukey=cWDNgiIxMsJayPNWtqM8Rc9amSOIgC0SI9Ko3jxxW2uV9mcoLNLdl4Q1U%2BrV9UhKIs3das0Cizzc8atumDKxG5nHSDPPthMpgeq5Xqa02MDie21AnddLn9BUUyOdXVEOsbvHRrlq1S61OS4%2BRpRffcBRIuwbJUdeL%2FEcZRNmvBtBzhuGQhuRU9fs%2BM9pyrRyVvKRlq5SmzZRSXFYcAjYcQ%3D%3D

https://www.jianshu.com/p/9c8c9272e12e

is_numeric函数
在判断是否是数字时会忽略字符串开头的’ ‘、’\t’、’\n’、’\r’、’\v’、’\f’。
​ 而’.’可以出现在任意位置,E、e能出现在参数中间,仍可以被判断为数字。也就是说is_numeric(“\r\n\t 0.1e2”) >> TRUE
intval()函数会忽略’’ ‘\n’、’\r’、’\t’、’\v’、’\0’ ,也就是说intval(“\r\n\t 12”) >> 12

PHP变量名不能带有点[.] 和空格,否则在会被转化为下划线[_]

parse_str("na.me=admin&pass wd=123",$test);
var_dump($test); 

结果:

  ["na_me"]=>
  string(5) "admin"
  ["pass_wd"]=>
  string(3) "123"
}

htmlspecialchars()函数默认只转义双引号不转义单引号,如果都转义的话需要添加上参数ENT_QUOTES

in_arrary()函数默认进行松散比较(进行类型转换)

in_arrary(“1asd”,arrart(1,2,3,4))    => true
in_arrary(“1asd”,arrart(1,2,3,4),TRUE)    => false   \\(需要设置strict参数为true才会进行严格比较,进行类型检测)

sprintf()格式化漏洞(可以吃掉转义后的单引号)
当我们输入的特殊字符被放到引号中进行转义时,但是又使用了sprintf函数进行拼接时,例如%1$’%s’ 中的 ‘%被当成使用%进行padding,导致后一个’逃逸了

还有一种情况就是’被转义成了\’,例如输入%’ and 1=1#进入,存在SQL过滤,’被转成了\’,于是sql语句变成了 select * from user where username = ‘%\’ and 1=1#’;如果这个语句被使用sprintf函数进行了拼接,%后的\被吃掉了,导致了’逃逸

$sql = "select * from user where username = '%\' and 1=1#';";
$args = "admin";
echo sprintf( $sql, $args ) ;
//result: select * from user where username = '' and 1=1#'
?>

不过这样容易遇到 PHP Warning: sprintf(): Too few arguments的报错,这个时候我们可以使用%1$来吃掉转义添加的\

<?php
$sql = "select * from user where username = '%1$\' and 1=1#' and password='%s';";
$args = "admin";
echo sprintf( $sql, $args) ;
//result: select * from user where username = '' and 1=1#' and password='admin';
?>

php中 = 赋值运算的优先级高于and

$c = is_numeric($a) and is_numeric($b)程序本意是要a、b都为数字才会继续,但是当$a为数字时,会先赋值给$c,所以可能导致$b绕过检测

url标准的灵活性导致绕过filter_var与parse_url进行ssrf
parse_url() 是专门用来解析 URL 而不是 URI 的。不过为遵从 PHP 向后兼容的需要有个例外,对 file:// 协议允许三个斜线(file:///...)。其它任何协议都不能这样.

filter_var()函数对于http://evil.com;google.com 会返回false也就是认为url格式错误,但是对于0://evil.com:80;google.com:80/0://evil.com:80,google.com:80/0://evil.com:80\google.com:80/却返回true。

通过file_get_contents获取网页内容并返回到客户端有可能造成xss

if(filter_var($argv[1], FILTER_VALIDATE_URL)) {
   // parse URL
   $r = parse_url($argv[1]);
   print_r($r);
   // check if host ends with google.com
   if(preg_match('/baidu\.com$/', $r['host'])) {
      // get page from URL
      $a = file_get_contents($argv[1]);
      echo($a);
   } else {
      echo "Error: Host not allowed";
   }
} else {
   echo "Error: Invalid URL";
}

虽然通过filter_var函数对url的格式进行检查,并且使用正则对url的host进行限定,
但是可以通过data://baidu.com/plain;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pgo== 页面会将<script>alert(1)</script>返回给客户端,就有可能造成xss

parse_url与libcurl对与url的解析差异可能导致ssrf

当url中有多个@符号时,parse_url中获取的host是最后一个@符号后面的host,而libcurl则是获取的第一个@符号之后的。因此当代码对http://user@eval.com:80@baidu.com 进行解析时,PHP获取的host是baidu.com是允许访问的域名,而最后调用libcurl进行请求时则是请求的eval.com域名,可以造成ssrf绕过。此外对于https://evil@baidu.com这样的域名进行解析时,php获取的host是evil@baidu.com,但是libcurl获取的host却是evil.com

md5碰撞

$Param1="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x00\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\x55\x5d\x83\x60\xfb\x5f\x07\xfe\xa2"; 
$Param2="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x02\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\xd5\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
#008ee33a9d58b51cfeb425b0959121c9

$data1="\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c\x2f\xca\xb5\x07\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\xf1\x41\x5a\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\x72\x80\x37\x3c\x5b\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6\xdd\x53\xe2\x34\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\x28\x0d\x1e\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\xab\x6f\xf7\x2a\x70";
$data2="\xd1\x31\xdd\x02\xc5\xe6\xee\xc4\x69\x3d\x9a\x06\x98\xaf\xf9\x5c\x2f\xca\xb5\x87\x12\x46\x7e\xab\x40\x04\x58\x3e\xb8\xfb\x7f\x89\x55\xad\x34\x06\x09\xf4\xb3\x02\x83\xe4\x88\x83\x25\x71\x41\x5a\x08\x51\x25\xe8\xf7\xcd\xc9\x9f\xd9\x1d\xbd\xf2\x80\x37\x3c\x5b\xd8\x82\x3e\x31\x56\x34\x8f\x5b\xae\x6d\xac\xd4\x36\xc9\x19\xc6\xdd\x53\xe2\xb4\x87\xda\x03\xfd\x02\x39\x63\x06\xd2\x48\xcd\xa0\xe9\x9f\x33\x42\x0f\x57\x7e\xe8\xce\x54\xb6\x70\x80\xa8\x0d\x1e\xc6\x98\x21\xbc\xb6\xa8\x83\x93\x96\xf9\x65\x2b\x6f\xf7\x2a\x70";
#79054025255fb1a26e4bc422aef54eb4

目录
相关文章
|
25天前
|
自然语言处理 算法 前端开发
【软件设计师备考 专题 】编译、解释系统的基础知识和基本工作原理
【软件设计师备考 专题 】编译、解释系统的基础知识和基本工作原理
49 1
|
6月前
|
SQL 安全 前端开发
新手学习渗透测试常规思路
2017黑客新手工具系列集合附链接 - 知乎专栏|这门技术(艺术)一开始也不是每个人都会的,正所谓没有人一出生就会走路,从不懂到入门到深谙,一步步慢慢来,每个人都是这样;但是在这个过程中, 思路无疑是最重要的,没有做不到只有想不到,就跟咱们高中解题时有了思路就迎刃而解一样,手里拿着铲子(技巧知识)但不是道从何挖起岂不是悲哀。
|
7月前
|
SQL 安全 前端开发
Web安全性测试包括哪些要点?梳理下,总算搞明白了
Web安全性测试包括哪些要点?梳理下,总算搞明白了
119 0
Web安全性测试包括哪些要点?梳理下,总算搞明白了
|
测试技术 开发者
方便实用!软件测试面试题及答案这里面都有
软件测试属于技术类工种,因此,面试环节上也要比其他岗位的多上一个环节,分别是日常面试以及技术类问题面试,前者大家临场发挥就能搞定,而后者的话,由于技术性强,再加上很多人容易紧张,从而导致面试的通过率降低,所以,不少想在年后开始找工作的软件测试工程师们,就想要知道哪里有比较齐全的软件测试面试题及答案可以用作面试加持?
129 0
|
测试技术
初级软件测试面试题怎么找?提供的这两个地方你肯定用得上
最近几年,随着电子产品和互联网的蓬勃发展,各类科技公司如雨后春笋般出现,而软件公司作为科技类公司中的重要组成部分,在这支互联网大军中也占据了重要一席。因而,负责软件问题质检的软件测试岗位也逐渐成了这几年炙手可热的就业岗位之一。
106 0
|
数据采集 域名解析 XML
漏洞猎人赏金笔记-如何编写Bug Bounty自动化脚本
前言 本文原文作者为@pry0cc,本文主要是对原文相关内容的提炼以及笔记,出于易读性考虑,笔者对很多地方做了一定量的注释或者删改(因为原文中的脚本存在一定问题)。 本文主要讲解的是经典的自动化信息搜集以及数据处理和漏洞扫描的流程.
408 0
漏洞猎人赏金笔记-如何编写Bug Bounty自动化脚本
|
自然语言处理 编译器 C语言
|
存储 Web App开发 缓存
在前端学习道路上,容易混淆的几个知识点!
在前端学习道路上,容易混淆的几个知识点!
在前端学习道路上,容易混淆的几个知识点!
|
安全 PHP 数据安全/隐私保护
代码审计入门总结
参考文献:http://www.vuln.cn/6701 通用思路 通读全文代码,从功能函数代码开始阅读,例如include文件夹下的common_fun.php,或者有类似关键字的文件。
1455 0
|
编译器 Android开发 C++
工作中遇到的C++语言基础和常见错误
## C++历史及标准 这里简单列一下```C++```发展进程中的几次重大事件以及我常使用的典型特性,各个标准支持的具体细节可参阅ISO标准文档。 - ```C With Classes```:支持C++基础语言特性,包括多态、异常处理、模板、命名空间等 - ```C++98```:STL、RTTI、模板、异常处理及其它标准库实现 - ```C++03```:修复C++98中的缺
1086 0