PHP代码审计入门

博客转载 --代码审计入门

代码审计--准备

1,先放一张大图,php代码审计的几个方向,也是容易出问题的地方,没事的时候可以多看看。

 

2,代码审计也就是拿到某网站的源码,进行审计,从而发现漏洞,但是我们审计的时候并不一定要一行一行的去看吧,这样未免也太浪费时间了,所以我们需要工具进行帮助我们。当属 "Seay源代码审计系统2.1" 优先选择(静态分析,关键字查找定位代码不错,但是误报很高)。

我们在做代码审计的时候,个人建议先要把审计的某CMS随便点点,先熟悉一下功能。代码审计前先进行黑盒测试是个不错的选择,知道哪里有问题,然后再去找出问题的代码。

要关注变量和函数,

1.可以控制的变量【一切输入都是有害的 】
2.变量到达有利用价值的函数[危险函数] 【一切进入函数的变量是有害的】
                                                                    ------来源t00ls
 

代码审计--漏洞

一,漏洞类型

1.sql注入

2.文件操作[上传/写入/读取/删除]
3.文件包含
4.命令执行
5.xss
6.cookie欺骗
7.逻辑漏洞
........等等
 
我们平常再进行黑盒测试时,上面的每种漏洞都有相对应的挖掘技巧,这里代码审计也是有技巧的。我们进行黑盒测试getshell的时候,往往是上面的sql注入,文件操作(上传),文件包含,命令执行相对容易getshell的。xss的话危害也很大,可以泄露内网的信息,如果的是存储型xss的话,就可以打管理员的cookie,然后进行下一步的攻击。逻辑漏洞是相对麻烦的,危害是很要命的,逻辑漏洞也分为很多种,其中一元买东西是很出彩的,这里通过修改订单进行伪造支付金额。
所以我们要认识清楚漏洞原理,积累cms常出漏洞,积累找这种漏洞的技巧。
 
二,漏洞分析
下面我们就进行分析一下各种漏洞形成的原因吧
1,首先我们要做好准备工作,审计环境:windows环境(Apache+MySQL+php),可以使用集成的,wampserver,phpstudy其他
 
2,准备好了就直接上手分析吗?其实有更不错的选择,那就是----黑盒+白盒。黑盒很重要!黑盒很重要!黑盒很重要!这是重要的事情。我们在黑盒测试的时候,可以花费点时间,因为用的时间越多,我们对所要分析的CMS的功能更熟悉,代码审计的时候也就容易分析,比如看到搜索框,当然要看下有没有注入或者是能不能弹出来框框,以及留言板有没有xss。交互的数据很重要!
这里有个小技巧, 本地测试的时候要把输入点打印出来。
将用户的输入数据进行var_dump,重要的是对最终的sql语句进行var_dump,这和给你省去很多力气!我们只要var_dump($sql)然后再可以去黑盒测试,[比如搜索框,用户登入,文件上传名称等等]。
 
3,现在可以进行漏洞分析了,下面会写到比较常见的漏洞类型以及审计不同漏洞的技巧。
 
XSS漏洞
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。 xss分为存储型的xss和反射型xss, 基于DOM的跨站脚本XSS。
 
【反射型】

反射型xss审计的时候基本的思路都一样,通过寻找可控没有过滤(或者可以绕过)的参数,通过echo等输出函数直接输出。寻找的一般思路就是寻找输出函数,再去根据函数寻找变量。一般的输出函数有这些:print , print_r , echo , printf , sprintf , die , var_dump ,var_export。

测试代码如下:

<?php
echo $_GET['xssf'];
?>

http://127.0.0.1/test/xssf.php?xssf=<script>alert(/orange/);</script>

xss

我们可以用渗透平台 DVWA

分析如下:首先看下源码

<?php 

// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
    // Feedback for end user 
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; 
} 

?>

  

这里我们可以清楚的看到 if 里面的php函数array_key_exists,现在不懂没关系,百度一下你就知道。

array_key_exists(key,array)

key--键值
arrray--规定数组


输入的值也就是GET得到的值是以数组的形式,然后判断GET得到的name是不是空,如果满足 if 语句,这里就会进行 if 括号里面的

 echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; 

我们可以清楚的看到,这里直接输出传的name参数,并没有任何的过滤与检查,存在明显的XSS漏洞。

medium中等难度下的代码

<?php 

// Is there any input? 
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { 
    // Get input 
    $name = str_replace( '<script>', '', $_GET[ 'name' ] ); 

    // Feedback for end user 
    echo "<pre>Hello ${name}</pre>"; 
} 

?>

可以看到有一点上low的代码是不一样的,那就是进行了一次过滤,

用的str_replace()函数,这个函数的功能是:以其他字符替换字符串中的一些字符(区分大小写)。

这里的作用是替换<script>,也就是把<script>替换成空格,然后再进行输出。

这里对输入进行了过滤,基于黑名单的思想,使用str_replace函数将输入中的<script>删除,这种防护机制是可以被轻松绕过的。

双写绕过:输入<sc<script>ript>alert(/xss/)</script>,成功弹框。

大小写混淆绕过:输入<ScRipt>alert(/xss/)</script>,成功弹框

High等级也是基于黑名单思想,进行过滤。但是我们可以通过其他标签来进行XSS。

$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); 


。。。后续学习内容再补充(学业繁忙)

猜你喜欢

转载自www.cnblogs.com/Thegonedays/p/9903302.html
今日推荐