PHP 常见漏洞威胁函数 | 全面总结

admin 2024年12月16日14:03:44评论15 views字数 8649阅读28分49秒阅读模式
点击上方蓝色文字关注↑↑↑↑↑

安全君呀设为"星标️"

第一时间收到文章更新

声明: 安全君呀 公众号文章中的技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与本公众号无关。

文章声明:本篇文章内容部分选取网络,如有侵权,请告知删除。

根据 cobra 规则,总结了一些 PHP 常见漏洞威胁函数。

PHP 常见漏洞威胁函数 | 全面总结PHP 常见漏洞威胁函数 | 全面总结

其它工具的规则也可以进行查看。比如我们去查看一下 Badcode 里面的一些检查规则,发现也类似。

PHP 常见漏洞威胁函数 | 全面总结

所以先学习代码审计,你可以先学习一下 PHP 常见威胁函数有哪些,然后再查看这些函数是如何调用的,最后整体进行漏洞挖掘。工具进行测试,也可以手工加工具进行测试。最后结果漏洞发现,不管采用哪种方式,你都可以达到一个上升。
PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
注入敏感函数
select from 、mysql_connect、mysql_query、mysql_fetch_*、update、insert、delete

(1)案例 1

为了讲解这些常用函数,临时写了一个 HRvul 小靶场进行漏洞练习。参考了部分安全靶场。
PHP 常见漏洞威胁函数 | 全面总结

PHP 常见漏洞威胁函数 | 全面总结首先看注入源码部分:

<?phpif(isset($_GET['Submit'])){    // Retrieve data    $conn=mysql_connect("localhost","root","root",3306);     mysql_select_db("hrexp",$conn);     inject_checking(strtolower($_SERVER['QUERY_STRING']));     $id = $_GET['id'];     $getid = "SELECT * FROM users WHERE id = $id";     print_r($getid);     $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );    echo "<br/>";    print_r(mysql_fetch_array($result));

对 query_string 传过来字符进行检查 inject_checking 函数,我们再看一下这个函数有哪些操作:

<?phpfunction inject_check($str) { //防注入函数开始$check=preg_match('/select|order|insert|update|eval|document|delete|injection|jection|link|and|or|from|union|into|load_file|outfile|<script>/',$str);     if($check){     echo "<script>alert('Filtered!!!');window.history.go(-1);</script>";exit();}else{return $str;}}
对常见函数都进行检查,我们看看能不能进行绕过,可以直接对常见函数进行编码既可以绕过。
PHP 常见漏洞威胁函数 | 全面总结

PHP 常见漏洞威胁函数 | 全面总结

(2)案例 2

<?php$dbuser = "root";$dbpwd = ""; //这里是 mysql 的密码$db = "test";$conn = mysql_connect("localhost",$dbuser,$dbpwd) or die("error");mysql_select_db($db,$conn);$id = $_GET['id'];$query = "select * from test where id =$id";$result = mysql_query($query) or die(mysql_error());print_r(mysql_fetch_array($result));
PHP 常见漏洞威胁函数 | 全面总结
这里我们用到了 mysql_query 这个函数。由于$id 参数在传参过程中没有进行修饰,直接传给了 MySQL。造成了注入。
PHP 常见漏洞威胁函数 | 全面总结

(3)案例 3

Simple Down 简单下载系统 v5.4

PHP 常见漏洞威胁函数 | 全面总结

从源码状态来看,应该没过滤直接 mysql_query 或者过滤不严格。

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
宽字节注入
set names gbk、character_set_client=gbk mysql_set_charset('gbk')、iconv

宽字符是指两个字节宽度的编码技术,如 UNICODE、GBK、BIG5 等。当 MYSQL 数据库数据在处理和存储过程中,涉及到的字符集相关信息包括:

character_set_client:客户端发送过来的 SQL 语句编码,也就是 PHP 发送的 SQL 查询语句编码字符集。character_set_connection:MySQL 服务器接收客户端 SQL 查询语句后,在实施真正查询之前 SQL 查询语句编码字符集。character_set_database:数据库缺省编码字符集。character_set_filesystem:文件系统编码字符集。character_set_results:SQL 语句执行结果编码字符集。character_set_server:服务器缺省编码字符集。character_set_system:系统缺省编码字符集。character_sets_dir:字符集存放目录,一般不要修改。
PHP 常见漏洞威胁函数 | 全面总结
宽字节对转义字符的影响发生在 character_set_client=gbk 的情况,也就是说,如果客户端发送的数据字符集是 gbk,则可能会吃掉转义字符,从而导致转义消毒失败。 例子 3 就是一个存在宽字符注入漏洞的 PHP 程序。
PHP 常见漏洞威胁函数 | 全面总结
<?php $name=$_GET['name']; $name=addslashes($name); $conn=mysql_connect('localhost','root','root'); if($conn==null){exit("connect error !<br>");} mysql_query("SET NAMES 'gbk'",$conn); mysql_select_db("hongri",$conn); $sql="select * from hongrisec where name='".$name."'"; $result=mysql_query($sql,$conn); while($val=mysql_fetch_row($result)){      print_r($val);      print("<br>"); ?>

产生漏洞代码我们已经利用黄色底纹已经标出来,主要数据库编码采用了 gbk编码,导致了宽字节注入。

POC 如下http://127.0.0.1/hongri/hongrisec.php?name=a%df' or 1=1; +%23 其原理是 mysql_query("SETNAMES 'gbk'",$conn)语句将编码字符集修改为 gbk,此时,%df'对应的编码就是%df%5c’,即汉字“運’”,这样单引号之前的转义符号“”就被吃调了,从而转义失败。
PHP 常见漏洞威胁函数 | 全面总结

一个汉字就把单引号吃掉了,导致过滤失败,注入我们还可以继续进行。

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
二次编码注入
urldecode、rawurldecode
seay 代码审计书中也描述过二次编码注入,主要是利用工具采用正则进行编码寻找,然后寻找漏洞。
PHP 常见漏洞威胁函数 | 全面总结

代码分析:

<?php$a=addslashes($_GET['p']);$b=urldecode($a);echo '$a='.$a;echo '$b='.$b;?>
主要是 urldecode 这个函数导致问题。Addslashes 函数主要是对单引号、双引号加反斜线进行注释。而 urlencode 这个函数又进行编码了,导致漏洞产生。比如我们进行编码,%2527,在这里%25 编码的结果是%,如果程序使用 urldecode函数,会直接和 27 数字连接上,形成单引号导致绕过 addslashes 函数,形成注入。
PHP 常见漏洞威胁函数 | 全面总结

PHP 常见漏洞威胁函数 | 全面总结

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
MySQL 二次注入讲解

在浏览文章的时候,发现一个图片比较好,就给大家放过来更容易理解二次注入。

PHP 常见漏洞威胁函数 | 全面总结

来段代码讲解一下,比较典型代表了二次注入。Hrconfig.php 

<?phpmysql_connect('localhost', 'root', 'root');mysql_select_db('hongrisec');mysql_set_charset('utf-8');if (!get_magic_quotes_gpc()){//主要判断 GPC 是否打开,如果 GPC 打开就利用 GPC 过来单引号、双引号等特殊字符。如果没开启直接去调用 addslashes_deep 函数,这个函数在下方已经定义。    if (!empty($_GET)){        $_GET = addslashes_deep($_GET);    }    if (!empty($_POST)){        $_POST = addslashes_deep($_POST);    }    $_COOKIE = addslashes_deep($_COOKIE);    $_REQUEST = addslashes_deep($_REQUEST);}function addslashes_deep($value){    if (empty($value)){        return $value;    }else {        return is_array($value) ? array_map('addslashes_deep', $value): addslashes($value);    }}?>

Hrreg.php

<?phpinclude "config.php";if(!empty($_POST['submit'])){//判断 submit 发送过来的值    $username = $_POST['username'];    $password = $_POST['password'];    $email = $_POST['email'];    $sql = "INSERT INTO `hongrisec`.`users` (`id`, `username`, `password`, `email`) VALUE (NULL, '$username', '$password', '$email');";    $row = mysql_query($sql);//把我们输入的值插入到数据库的 users 表里面,看到没有经过任何过滤。    if ($row){        echo "注册成功";    } else {        echo "注册失败";    }}?><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><body><form action="" method="POST">    <h4><b> username:</b><input type="text" name="username"><br/></h4>    <h4><b> password:</b><input type="text" name="password"><br/></h4>    <h4> <b>email:</b><input type="text" name="email"><br/></h4>    <input type="submit" name="submit" value="submit"></form></body>

PHP 常见漏洞威胁函数 | 全面总结二次注入的利用就是把第一次存储到数据库里面的值在此调用然后进行二次利用。

Search.php

<?phpinclude "hrconfig.php";if(!empty($_POST['submit'])){    $email = $_POST['email'];//这里对 email 也进行了查询    $sql = "select * from users where email='{$email}'";    $row = mysql_query($sql);    if ($row){        $rows = mysql_fetch_array($row);        $username = $rows['username'];//这里主要对$username 又重新进行调用,所以产生了漏洞        $sql = "select * from users where username='$username'";        $row = mysql_query($sql) or die(mysql_error());        if ($row){            $rows = mysql_fetch_array($row);            echo $rows['username']."<br/>";            echo $rows['password']."<br/>";            echo $rows['email']."<br/>";        }    }}?><body><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><form action="" method="POST">    <h3><b>search email</b><input type="text" name="email"><br/></h3>    <input type="submit" name="submit" value="ok"></form></body>

PHP 常见漏洞威胁函数 | 全面总结

代码已经为大家分析完毕。现在直接进行操作。首先在输入表里面输入字段。

PHP 常见漏洞威胁函数 | 全面总结

我们已经在输入把单引号已经输入进去,我们查看一下数据库。
PHP 常见漏洞威胁函数 | 全面总结

PHP 常见漏洞威胁函数 | 全面总结

然后调用邮箱,发现直接触发单引号导致报错。

PHP 常见漏洞威胁函数 | 全面总结

然后我们重新注册一个语句。利用 MySQL 语句进行注册

PHP 常见漏洞威胁函数 | 全面总结

插入数据库语句。然后在利用查找语句进行查找邮箱语句。

PHP 常见漏洞威胁函数 | 全面总结发现已经查找成功。

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
文件包含
include、include_once 、require、require_once

本地包含漏洞常见漏洞代码:

<?phpif (isset($_GET[page])) {//这句语句是核心语句,主要利用 GET 语句进行包含。我们可以构造一些语句进行绕过,不过现在这样语句已经非常少了。include $_GET[page];} else {include "home.PHP";}?>

案例 2

1.包含文件上传的图片<?phpif ($_GET[page]) {    include($_GET[page]);} else {    include "show.php";} //利用 page=/uploads/xxx.jpg用户控制$_GET[page]里面内容 包含一个带有恶意代码的上传图片。getshell(其中要找到上传图片的绝得路径) 2.包含文件上传的第二种 <?phpif ($_GET[page]) {    include("./action/".$_GET[page]);} else {    include "./action/show.php";} //利用 page=../uploads/xxx.jpg 跳出当前目录3.第三种包含上传 <?phpif ($_GET[page]) {    include("./action/".$_GET[page].".php");} else {    include "./action/show.php";} // 可以看出会在后面追加一个.php 后缀 ../uploads/xxx.jpg%00 截断后面的.php需要开启(magic_quotes_gpc=off,php 小于 5.3.4)
PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
文件上传
move_upload_file

直接看代码讲解:

<?phpif($_FILES['userfile']['type'] != "image/gif") #这里对上传的文件类型进行判断,如果不是 image/gif 类型便返回错误。{    echo "Sorry, we only allow uploading GIF images";    exit;}$uploaddir = 'uploads/';$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))//move_uploaded_file 主要是把文件移动到一个位置{    echo "File is valid, and was successfully uploaded.n";} else {    echo "File uploading failed.n";}?>

主要是对图片类型进行判断,如果不是图片类型就返回错误。上传内容也比较多。后续看我们完整版本报告。

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
任意文件删除
unlink、session_destory

代码注入 :

eval assert、preg_replace(/e)、 call_user_func、call_user_func_array、array_map

展示界面:PHP 常见漏洞威胁函数 | 全面总结然后直接进行代码讲解:

<?phpinclude "hrconfig.php";if(!empty($_POST['submit'])){    $username = $_POST['username'];    $password = $_POST['password'];    $email = $_POST['email'];    @eval("$var1=$username;");//这里直接进行了代码执行操作。我们直接输入 phpinfo 语句。    echo $var1;    @eval("$var2=$password;");    echo $var2;}?><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><body><h1>PHP Code Injection</h1><form action="" method="POST">    <h3><b> username:</b><input type="text" name="username"><br/></h3>    <h3><b> password:</b><input type="text" name="password"><br/></h3>    <h3> <b>email:</b><input type="text" name="email"><br/></h3>    <input type="submit" name="submit" value="submit"></form></body>

PHP 常见漏洞威胁函数 | 全面总结PHP 常见漏洞威胁函数 | 全面总结直接当成代码执行。

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
命令执行

system、exec、shell_exec、passthru 、pctnl_exec、popen、proc_exec、命令讲解

<?php$cmd=$_GET['hongri'];echo shell_exec($cmd);?>

直接当成命令执行。Hongri 的值如果可以控制,我们就可以执行我们想执行的命令。PHP 常见漏洞威胁函数 | 全面总结

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
变量覆盖
extract、parse_str、$$

函数演示实例演示 wooyun:frcms (wooyun 2014-073244)

PHP 常见漏洞威胁函数 | 全面总结

他会把你从 GET、POST、COOKIE 中的变量注册为全局变量,因此我们直接通过GET 参数提交 $insLockfile 变量即可绕过。

PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
反序列化
Unserialize、serialize()

代码讲解:当在 php 中创建了一个对象后,可以通过 serialize()把这个对象转变成一个字符串,保存对象的值方便之后的传递与使用。测试代码如下:

<?phpclass hongrisec{    var $test = '123';}$class1 = new hongrisec;$class1_ser = serialize($class1);print_r($class1_ser);?>

然后我们查看一下反序列化之后的值 O:9:"hongrisec":1:{s:4:"test";s:3:"123";} 这里的 O 代表存储的是对象(object),假如你给 serialize()传入的是一个数组,那它会变成字母 a。

9 表示对象的名称有 9 个字符。"hongrisec"表示对象的名称。1 表示有一个值。

{s:4:"test";s:3:"123";}中,s 表示字符串,4 表示该字符串的长度,"test"为字符串的名称,之后的类似。

unserialize() 与 serialize() 对应的,unserialize()可以从已存储的表示中创建 PHP 的值,单就本次所关心的环境而言,可以从序列化后的结果中恢复对象(object)。

PHP 常见漏洞威胁函数 | 全面总结
<?phpclass hongrisec{    var $test = '123';}$class2 = 'O:9:"hongrisec":1:{s:4:"test";s:3:"123";}'; print_r($class2);echo "</br>";$class2_unser = unserialize($class2);print_r($class2_ser);?>
反序列之后,就还原成 serialize 之后的。反序列化漏洞就在序列化的时候插入我们需要插入代码。造成漏洞利用化,但是利用漏洞有一定的限制。具体漏洞讲解请参考完整报告。
PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
PHP 常见漏洞威胁函数 | 全面总结
随机数
rand、mt_rand

将在后续中更详细介绍。

PHP 常见漏洞威胁函数 | 全面总结

Tips

欢迎大家在下面点赞评论加关注,让我们一起在网安之路越走越远!!!

END

原文始发于微信公众号(安全君呀):PHP 常见漏洞威胁函数 | 全面总结

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月16日14:03:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP 常见漏洞威胁函数 | 全面总结https://cn-sec.com/archives/3507756.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息