九零登录

[【通过】] 那些年被绕过的函数

[复制链接]
发表于 2016-12-12 23:26:13 | 显示全部楼层 |阅读模式
自己整理的一些小技巧,基本都是网上公开的,但目前还没有整理好的一些文章,自己整理一下求换个邀请码。


Php有很多自带函数,这些函数使用非常广泛。但是也有一些函数存在一些漏洞、或者配合一些环境因素很轻松的被绕过。最近在学php代码审计,针对网上公开的一些php函数的漏洞进行可整理。在进行代码审计的时候可直接搜索定位使用相关函数的语句,重点关注。
1.preg_replace绕过(magic_quotes_gpc=off)
<?php
//preg_match绕过
$test=$_GET['test'];
echo $test=preg_replace("/^(.*)(')/", "\\1\\\\'", $test); ?>



在这个页面中如果提交’ and 1=1则会被过滤成\’ and 1=1 这时候可以用%0D%0A来绕过。


实例:http://wooyun.org/bugs/wooyun-2010-0156874

2:addslashes(magic_quotes_gpc=off)

这个适用于magic_quotes_gpc=off、很多程序员会利用addshashes来代替magic_quotes_gpc,但addslashes只是实现了magic_quotes_gpc一部分的功能而已,
magic_quotes_gpc不仅仅处理变量值,还处理变量名。

3:create_function

<?php
//how to exp this code
$sort_by=$_GET['sort_by'];
$sorter='strnatcasecmp';
$databases=array('test','test');
$sort_function = '  return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);';
usort($databases, create_function('$a, $b', $sort_function));
?>



当我们提交?sort_by="]);}phpinfo();/*时会执行phpinfo()

来自:http://www.2cto.com/Article/201212/177146.html

4:eval
这个只能算是php的一个特性,不能称之为漏洞。Eval会执行””之内的语句。

<?php
$test=”phpinfo();”;
Echo $test;
?>



这样执行的话输出的就是phpinfo();字符串,而如果eval($test)则会输出phpinfo()的内容。

5:iconv

string iconv ( string $in_charset , string $out_charset , string $str )
iconv在字符编码转换时可能导致字符串截断。
Fuzz脚本
<?
$a = "1.php";
$b = ".jpg";
for($i=0; $i<200; $i++){
    $c = $a.chr($i).$b;
    $d = iconv("UTF-8", "gb2312", $c);
    echo "$i ==> ".$d."n"."<br>";
}
?>



效果图:


可以看到从128(0x80)开始出错。但是没有出现预料的输出1.php。可能是环境问题。。所以我换了一个环境成功

经测试apache+php(5.2-2.3n)、nginx+php(5.3n)、iis6只测试了一个版本php(5.2n)可以截断。其他因为环境不允许。没有测试。

实例:http://www.wooyun.org/bugs/wooyun-2014-048293

6:is_numeric

<?php
$id=$_GET['id'];
$s=is_numeric($_GET['test'])?$_GET['test']:0;
$con=mysql_connect("localhost","root","fuckhack!");
mysql_select_db("test",$con);
$sql="insert into is_num2(id,type) value($id,$s);";
mysql_query($sql);
?>



判断参数s是否为数字,是则返回数字,不是则返回0,然后带入数据库查询。
我们把‘1 or 1’ 转换为16进制 0x31206f722031 为s参数的值.

从图中可以看出来0x31206f722031被成功插入,且在数据库中显示的是1 or 1。

7:move_uploaded_file

move_uploaded_file ( string $filename , string $destination )
这次的漏洞就出现在$destination这个参数中,这个参数代表的是上传文件移动的最终目的地址。如果$destination变量是从用户$_GET或$_POST中获得的并且我们可控,那么我们可以利用空字符\x00来截断后面的拓展名,从而造成任意文件上传。
<?Php
@$filename=$_FILES['file']['name'];
@$tmp_name=$_FILES['file']['tmp_name'];
$destination="2/".$filename;
move_uploaded_file($tmp_name,$destination);
?>

<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>


点击上传,然后burp抓包

00截断即可绕过,这也是我们常见的上传漏洞
受影响的php版本
5.4.38~5.6.6,同时由于php 5.2版本本身就受到00截断漏洞的影响,所以也在受影响的行列之中。
8:str_replace绕过GPC
因为我本身环境问题。无法开启gpc所以不能完全模拟。
<?Php
$test=str_replace($_GET['a'],'',$_GET['b']);
echo $test;
?>



提交test.php?a=&b=%00' 输出\0\'  
如果提交test.php?a=0&b=%00' 即可把0给替换掉输出\\’ 成功绕过gpc

原文:http://zone.wooyun.org/content/2700

9:strcmp

<?php
$password=$_GET['password'];

if(strcmp('test',$password)){
    echo 'NO!';
}else{
    echo 'YES!';
}


?>

当输入?Password=1的时候输出no.当?Password[]=1时即可绕过strcmp输出yes

10:unserialize
这个是最近比较流行的一个函数了。Joomla因为他又火了一阵。
利用unserialize的条件要具备一下几点,

1.unserialize函数的参数可控
2.脚本中存在一个构造函数、析构函数、__wakeup()函数中有向php文件中写数据的操作的类
3.所写的内容需要有对象中的成员变量的值。
感觉我说肯定没有大牛们解释的清楚,具体的去看seay大牛的文章吧。
地址:http://www.cnseay.com/875/

11:一个php小特性

在进行php代码审计的时候要格外注意``,php会把``认为是系统命令。
如果``中的内容可控,那么就形成了一个自带的后门
<?Php
echo `$_GET[ver]`;
?>

目前整理的就这些,先写这些。如果大家还有也可以共享一下吧。如果以后再遇到一些函数的漏洞,依旧会继续整理的。


评分

参与人数 1酒票 +5 收起 理由
管理05 + 5 欢迎加入90!

查看全部评分

 楼主| 发表于 2016-12-12 23:28:35 | 显示全部楼层
@管理05 从word中粘贴的文章全变成乱码了。。。
路人  发表于 2016-12-13 16:12:57

RE: 那些年被绕过的函数

没有 图
发表于 2016-12-13 18:25:09 | 显示全部楼层

RE: 那些年被绕过的函数

Am0s 发表于 2016-12-12 23:28
@管理05 从word中粘贴的文章全变成乱码了。。。

如果有图片 上传后才能显示
 楼主| 发表于 2016-12-13 19:06:28 | 显示全部楼层

RE: 那些年被绕过的函数

管理05 发表于 2016-12-13 18:25
如果有图片 上传后才能显示

这里怎么转正啊 我的积分都不加
发表于 2016-12-14 12:38:18 | 显示全部楼层

RE: 那些年被绕过的函数

Am0s 发表于 2016-12-13 19:06
这里怎么转正啊 我的积分都不加

积分=主题数+ 酒票 + 贡献 * 40
     正式成员所需积分由 50 更改为 40。
 楼主| 发表于 2016-12-14 19:33:49 | 显示全部楼层

RE: 那些年被绕过的函数

管理05 发表于 2016-12-14 12:38
积分=主题数+ 酒票 + 贡献 * 40
     正式成员所需积分由 50 更改为 40。

我看记录里有16个酒票。。但是用不了。。积分显示还是0

九零

GMT+8, 2026-10-22 15:18

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表