PHP-Audit-Labs审计学习

打算在代码审计上入下坑。本来找了个不知名cms想审计一下的。偶然间看到了星盟王叹之师傅在用php-audit-labs练审计,所以自己也打算练一下审计的技术,毕竟自己审计功力太差了...p牛也曾经说过,练习审计到能看懂一个完整的CMS就算有一定功底了。所以就把php-audit-labs的全部都过一遍吧。

(最近也总算熟练了一下node跟python相关的开发入门。等之后找时间把java入门知识过一遍,再把ECMAscript6的基础过一遍就差不多了)

Day1

in_array()

任意文件上传漏洞。主要问题在于in_array()函数的使用不当。如果未设置in_array()第三个参数为true则我们可以通过上传7shell.php绕过检查。因为7shell.php被转换为7.
同样出现在某cms中利用这点可以绕过进行insert_into注入

当in_array()绕过后轻松达成注入。
1,1 and if(ascii(substr((select database()),1,1))=112,1,sleep(3)));#

练习

config.php


index.php

connect_error) {
    die("连接失败: ");
}

$sql = "SELECT COUNT(*) FROM users";
$whitelist = array();
$result = $conn->query($sql);
if($result->num_rows > 0){
    $row = $result->fetch_assoc();
    $whitelist = range(1, $row['COUNT(*)']);
}

$id = stop_hack($_GET['id']);
$sql = "SELECT * FROM users WHERE id=$id";

if (!in_array($id, $whitelist)) {
    die("id $id is not in whitelist.");
}

$result = $conn->query($sql);
if($result->num_rows > 0){
    $row = $result->fetch_assoc();
    echo "
"; foreach ($row as $key => $value) { echo "
"; echo "
"; } echo "
$key
$value
"; } else{ die($conn->error); } ?>

这题的in_array()并不是难点。因为只要id开头为数字就能绕过了
主要问题在于后面注入上。
所幸语句中会爆出sqlerror.在过滤了这些关键字的情况下仍可以使用报错函数,select,from等基本就足够得到flag了。
不过这里存在一个细节,就是updatexml这样的报错函数如果语句中不包含特殊字符也就是我们原来经常使用的0x7e之类的字符,爆出的结果将会出现字符丢失的现象。

所以找替代的字符串连接函数即可.make_set()

?id=4 and (select updatexml(1,make_set(3,'~',(select flag from flag)),1))

其实自己原来做sql注入的题目也曾搜索过相关的内容。比如在concat被过滤的情况下不使用group_concat将所有查询结果都列出来。当时发现make_set()是能起到concat一样的效果的。但是注意的是,make_set至少接收两个参数,因此必须使用逗号。concat类则不然。

Day2

filter_var()

题目主要是在两处存在过滤。首先是twig模板里出现的{{link|escape}}(这种写法属于twig中 {{表达式|filters}} 的写法)

然后是一个filter_var()函数
这里escape过滤器调用的实际上是htmlspecialchars()函数。作用自然是将常见的特殊字符转为实体字符。
filter_var()在curl的ssrf中就曾见过。主要检查一个url是否合法。
因此代码逻辑主要是经过过滤后生成一个a标签。
那么可能存在self-xss

官方的payload
?nextSlide=javascript://comment%250aalert(1)达到弹窗的self-xss. 使用javascript伪协议绕过
巧妙的就是利用filtervar的缺陷轻松使用xxx://的形式绕过检查。然后也可以进行js语句的执行。重要的一点就是//在js中是注释符。因此使用%250a(double urlencode %0a 以绕过浏览器自动的解码)将后面的内容换行到下一行。成功执行alert.

某cms中的利用是,在访问404页面存在这样的代码


current_url()方法接受完整的404url参数。返回最后一个/后的内容拼接进code代码块。即可以插入xss代码导致了xss
payloadhttp://localhost/anchor/index.php/

练习

// index.php

You have curl {$site_info['host']} successfully!