0x00 写在前面
从零学习php,最终目的实现代码审计入门,软件采用sublime text,环境使用phpstudy搭建,数据库是navicat,需要有基本的前端基础、简单的php+mysql后端基础、渗透知识和漏洞原理,看看曾经遥不可及的代码审计能不能慢慢啃下来。
本章为代码审计入门第十篇,做靶场看到,既然和php代码相关,即使简单也学习记录一下,本题是有关爆破token的md5值。
0x01 函数展示
substr()函数
代码实例展示,唯一需要注意的是如果是证书是从0开始数的,也就是说下面的a是第0位,b才是第一位。
intval函数
较为基础不说了。
0x02 代码部分
题目代码部分
<?php //爆破token的md5值
error_reporting(0);
include('flag.php');
if(isset($_GET['token'])){ //get 传参
$token = md5($_GET['token']); //token进行md5加密
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
//如果token的md5值的第一位等于第十四位等于17位
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
//并且token的第一位+第十四位+第十五位/第一位等于第三十一位
echo $flag;
//输出flag,
}
}
}else{
highlight_file(__FILE__);
}
?>
如何解决
第一个条件满足
<?php
for($i=0;$i < 10000;$i++){ //书写循环,跑0到10000
$token =md5($i);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
echo 'token = '.$i.' md5='.$token; //满足条件后把i的值返回,把token值返回
}
}
?>
本地进行查看
添加第二个条件
<?php
for($i=0;$i < 10000;$i++){ //书写循环,跑0到10000
$token =md5($i);
if(substr($token, 1,1)===substr($token, 14,1) && substr($token, 14,1) ===substr($token, 17,1)){
if((intval(substr($token, 1,1))+intval(substr($token, 14,1))+substr($token, 17,1))/substr($token, 1,1)===intval(substr($token, 31,1))){
echo 'token = '.$i.' md5='.$token; //满足条件后把i的值返回,把token值返回
}
}
}
满足条件的参数遍历出来了
0x03 总结
这段时间忙于其它事情,没有写博客,现在回归正轨。