0x01
作为一个代码审计入门的小白,这几天的学习,最大的感受就是要多实践,多看代码。毕竟大力出奇迹。
0x02 审计
一般拿到一套CMS源码,有不同的审计思路,大概分为这几种,追踪危险函数,然后回溯。按功能点来进行审计。直接通读全文代码。或者跟踪数据流进行审计。但不管那种,我觉得因该先看入口文件,了解整体框架结构,网站配置。
0x03 漏洞
文件包含漏洞
本地文件包含
函数有:
include(),include_once(),require(),require_once()
文件包含截断:
1、%00截断(php版本小于5.3)
2、问号截断(问号后面相当于请求的参数,伪截断)
3、英文(.) 反斜杠(/) 截断
文件读取漏洞
函数有:
file_get_contents(),highlight_file(),fopen(),readfile(),fread(),fgetss(),fgets(),parse_ini_file(),show_source(),file()
文件上传漏洞
函数有:
move_uploaded_file — 将上传的文件移动到新位置
代码执行漏洞
函数有:
eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()
eval()和assert()区别,当assert()的参数为字符串时也可执行PHP代码
eval(" phpinfo() "); 不可以执行
assert(" phpinfo() "); 可以执行
call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…)
第一个参数为回调函数,第二个参数是回调函数的参数
<?php $b = "phpinfo()"; call_user_func($_GET["a"], $b); //a=assert
命令执行函数
函数有:
system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()
逻辑漏洞
(1) in_array(): 比较之前会自动转换类型
(2)双等于==和三等于===:
双等于会在变量比较时,进行类转换,与in_array()是一样的问题。
三等于在判断之前不会做类型转换,type和value进行双重比较。
双引号和单引号的区别
单引号解析纯字符串,双引号会解析中间的变量。
$a = 1 echo " $a " output:1 echo ' $a ' output:$a
变量覆盖漏洞
函数有:
extract(),parse_str(),import_request_variables()
遍历初始化变量
<?php //var.php?a=fuck $a='hi'; foreach($_GET as $key => $value) { $$key = $value; } print $a; ?>
parse_str()变量覆盖
//var.php?var=new $var = 'init'; parse_str($_SERVER['QUERY_STRING']); print $var;
文件操作
copy:拷贝文件
file_get_contents:将整个文件读入为一个字符串
file_put_contents:将一个字符串写入文件
file:把整个文件读入一个数组中
fopen:打开文件或者 URL
move_uploaded_file:将上传的文件移动到新位置
readfile:输出文件
rename:重命名一个文件或目录
rmdir:删除目录
unlink & delete:删除文件
<和<< 操作
参考链接:
http://blog.neargle.com/SecNewsBak/drops/%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E5%85%A5%E9%97%A8%E6%80%BB%E7%BB%93.html
https://www.zybuluo.com/Dukebf/note/715934
https://github.com/Jyny/pasc2at