一个同事今天与我打赌,他知道一种提供特殊格式的字符串的方法,可以通过以下正则表达式检查,并仍然提供扩展名为.PHP或.jsp或.asp的文件名:
if (preg_match('/\.(jpeg|jpg|gif|png|bmp|jpe)$/i',$var) && preg_match('/\.(asp|jsp|PHP)$/i',$var) == false) 
{
    echo "No way you have extension .PHP or .jsp or .asp after this check.";
}

我很努力地尝试了自己,搜索网络,我无法找到一个可能使这样的事情发生的缺陷.我可以俯视吗?鉴于处理“空字节”漏洞,这里还有什么问题?

注意:我并不暗示这个代码是一个完整的检查文件扩展名的方法,在preg_match()函数中可能有缺陷,或者文件内容可能是不同的格式,我只是问这个问题的正则表达式语法本身.

编辑 – 实际代码:

if (isset($_FILES["image"]) && $_FILES["image"]["name"] && preg_match('/\.(jpeg|jpg|gif|png|bmp|jpe)$/i',$_FILES["image"]["name"]) && preg_match('/\.(asp|jsp|PHP)$/i',$_FILES["image"]["name"]) == false) {
        $time = time();
        $imgname = $time . "_" . $_FILES["image"]["name"];
        $dest = "../uploads/images/";

        if (file_exists($dest) == false) {
            mkdir($dest);
        }

        copy($_FILES['image']['tmp_name'],$dest . $imgname);

    }else{
        echo "Invalid image file";
    }

PHP版本:5.3.29

编辑:结尾

证明“漏洞”仅在Windows上呈现.然而,它确实是我的同事告诉我的,它将通过正则表达式检查,并以可执行扩展名保存文件.以下是使用PHP 5.3.13在WampServer 2.2上进行了测试:

将以下字符串传递到test.PHP上面的正则表达式检查:.jpg(注意在所需扩展名结尾处的“:”冒号符号)将验证它,并且函数copy()似乎省略了包含符号的冒号后的所有内容本身.
再次,这只适用于Windows.在linux上,文件将被完全写入与传递给该函数的相同名称.

没有一个步骤或完全直接的方式来利用你的代码,但这里有一些想法.

你在这个例子中传递给copy(),但是你已经提到你已经使用这个方法验证文件ext了一段时间,所以我假设你有其他情况可能已经使用这个过程与其他功能在不同的PHP版本.

将其视为测试程序(Exploiting include,require):

$name = "test.PHP#.txt";
if (preg_match('/\.(xml|csv|txt)$/i',$name) && preg_match('/\.(asp|jsp|PHP)$/i',$name) == false) {
    echo "in!!!!";
    include $name;
} else {
    echo "Invalid data file";
}

这将最终通过打印“in !!!!”并执行’test.PHP’,即使它是上传它将包括它从tmp文件夹 – 当然,在这种情况下,你已经拥有的攻击者,但我们也考虑这个选项.
上传过程不是常见的情况,但它是一个可以通过组合几种方法来利用的概念:

我们继续吧 – 如果你执行:

//$_FILES['image']['name'] === "test.PHP#.jpg";
$name = $_FILES['image']['name'];
if (preg_match('/\.(jpeg|jpg|gif|png|bmp|jpe)$/i',$name) == false) {
    echo "in!!!!";
    copy($_FILES['image']['tmp_name'],"../uploads/".$name);
} else {
    echo "Invalid image file";
}

再次完美的该文件被复制到“uploads”文件夹 – 您无法直接访问它(因为Web服务器将剥离#的右侧),但是您注入该文件,并且攻击者可能会找到一种或另一个弱点来调用后来

这种执行场景的示例在共享和托管站点之间是常见的,其中文件由PHP脚本提供(在某些不安全的情况下)可以通过将文件包含在错误类型的函数中来加载文件,例如require,include,file_get_contents都是易受攻击的,可以执行该文件.

NULL字节
空字节攻击是PHP < 5.3但是在5.4版本中通过一些函数重新引入了一些函数,包括所有与文件相关的函数和更多的扩展.它被修补了好几次,但它仍然在那里,很多旧版本仍在使用中.如果您使用较老版本的PHP版本进行处理,则您绝对会被暴露:

//$_FILES['image']['name'] === "test.PHP\0.jpg";
$name = $_FILES['image']['name'];
if (preg_match('/\.(jpeg|jpg|gif|png|bmp|jpe)$/i',"../uploads/".$name);
} else {
    echo "Invalid image file";
}

会打印“在!!!!”并复制名为“test.PHP”的文件.

通过检查字符串长度之前和之后,将其传递给更深入的C过程,创建实际的字符数组,以及如果该字符串被空字节(表示C中的字符串结尾)截断的长度将不匹配. read more

奇怪的是,即使在补丁和现代PHP版本,它仍然在那里:

$input = "foo.PHP\0.gif";
include ($input); // Will load foo.PHP :)

我的结论:
您的验证文件扩展名的方法可以显着改善 – 您的代码允许一个名为test.PHP#.jpg的PHP文件通过,而不应该.成功的攻击主要是通过组合几个脆弱性甚至是小的攻击来执行的 – 你应该将任何意想不到的结果和行为视为一个.

注意:有更多的关于文件名和图片的问题,因为他们很多时间包括在页面以后,如果没有被正确过滤,并安全地包括你暴露了许多更多的XSS的东西,但这不在话题.

PHP正则表达式漏洞下注的更多相关文章

  1. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  3. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  4. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  5. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  6. swift的正则表达式(NSRegularExpression)

    init(_pattern:String){varerror:NSError?

  7. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  8. swift学习2 元组 tuples

    swift中出现了一种新的数据结构,非常牛掰的元组tuples如果懂PHP的猿,会发现这个元组和PHP的数组非常类似,同样是可以默认不指定key,也可以指定key目前的学习疑问是,如何进行元组的遍历?

  9. Swift截取HTML中的所有图片url

    在Swift中,要从HTML格式的String中截取出所有的img的所有图片url,要截取的url就要匹配url,需要用到正则表达式。

  10. 收藏swift正则表达式的各种验证

    1.验证邮箱classfuncvalidateEmail(email:String)->Bool{varemailString="[A-Z0-9a-z._%-]@[A-Za-z0-9.-]\\.[A-Za-z]{2,4}"varemailPredicate=nspredicate(format:"SELFMATCHES%@",emailString)returnemailPredicate.eva

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部