深圳专业做网站专业公司,莒县城乡建设局网站,代理网关app未运行,免费网站使用浅学一下吧~ 发开题目是这样的 最烦的就是代码审计#xff0c;还是看得少 多审计两篇代码就好了#xff08;还是因为自己会的不多#xff09; ?php
highlight_file(__FILE__);//将当前文件的源代码进行高亮显示
$key1 0;//将变量$key1的值初始化为0
$key2 0;//将变量…浅学一下吧~ 发开题目是这样的 最烦的就是代码审计还是看得少 多审计两篇代码就好了还是因为自己会的不多 ?php
highlight_file(__FILE__);//将当前文件的源代码进行高亮显示
$key1 0;//将变量$key1的值初始化为0
$key2 0;//将变量$key2的值初始化为0$a $_GET[a];//通过GET的方法传递的参数变量a和b的值赋给变量$a和$b
$b $_GET[b];if(isset($a) intval($a) 6000000 strlen($a) 3){//判断变量$a的值是否存在且满足条件$a的整数值大于6000000且$a的长度小于等于3if(isset($b) 8b184b substr(md5($b),-6,6)){//判断变量$b的值是否存在且满足条件将$b进行MD5加密取后6位并且与字符串8b184b进行比较$key1 1;}else{die(Emmm...再想想);//如果上面两个条件都满足将变量$key赋值为1否则输出“Emmmm..再想想” 并终止程序}}else{die(Emmm...);//如果有一个条件不满足则输出Emmmm...
}$c(array)json_decode($_GET[c]);//将通过GET方法传递的参数c进行json解码并将结果转化为数组
if(is_array($c) !is_numeric($c[m]) $c[m] 2022){//判断变量$c是否为数组且满足条件$c[m]不是数值且$c[m]大于2022if(is_array($c[n]) count($c[n]) 2 is_array($c[n][0])){//判断$c[n]是否为数组且满足条件$c[n]是一个包含两个元素的数组且$c[n][0]是一个数组$d array_search(DGGJ, $c[n]);//在数组$c[n]中搜索DGGJ在遍历过程中$d false?die(no...):NULL;//如果找不到则输出no..... 并终止程序在遍历过程中foreach($c[n] as $key$val){//遍历数组$c[n]的每个元素$valDGGJ?die(no......):NULL;//到这里如果还没有发现DGGJ就将$key2的值设为1}$key2 1;}else{die(no hack);//如果遍历上边那两个条件都未满足则输出no}
}else{die(no);//如果一个条件满足另一个条件不满足则输出no
}if($key1 $key2){include Hgfks.php;echo Youre right.\n;//如果$key1 和 $key2 的值都为1则包含一个名为Hgfks.php的文件并且输出 You re right 输出flagecho $flag;
}?
开始做题
if(isset($a) intval($a) 6000000 strlen($a) 3)
既然他说赋的值必须大于6000000且长度小于等于3 我们可以看到当1e7的时候 数值就已经比6000000大了所以1e7以上的柿子都可以 当然 长度必须是三位 1e7-1e9 都可以 当我们传参之后页面也已经给了回显说我们的传参是正确的
?php
highlight_file(__FILE__);
for($b1;$b100000;$b){if(preg_match(/8b184b/,substr(md5($b),-6,6))){echo $b;echo \n;echo md5($b);echo \n;}
} ? 查找小于100000的数并且后6位与8b184b相同的数字然后我们发现是53724验证一下 然后拿着去传参 通过了上面两个条件但是下面的条件还没完成呢 所以输出no 证明到这里我们做的是对的
接着往下走然后就是过滤下面一条规则
传入一个参数c 这个参数已经被json解码
他的条件是 不是数组 且大于2022
于是我们构造传参c[m:6666a]
因为我们要逐级过滤 所以要先判断m在判判断n
不是数组 我们就用数字加字符在一起绕过 数字只要比2022大就行 字符随便 发现返回 no hack 判定有效 接着往下走
if(is_array($c[n]) count($c[n]) 2 is_array($c[n][0]))
n的要求是判断$c[n]是否为数组且满足条件$c[n]是一个包含两个元素的数组且$c[n][0]是一个数组
$c[n]是一个包含两个元素的数组
n:[[111],0]
c{m:6666a,n:[[111],0]}
然后拿着构造好的paylode去传参 然后flag就出来啦
里面用到的函数
isset($a) 检查变量$a是否被设置 intval($a) 将变量$a转换成整数类型 strlen($a) 来计算$a的字符串长度 substr(md5($b),-6,6) 将$b进行md5加密从倒数第6位开始取6位后6位 (array) 创建一个名为array的数组 json_decode($_GET[c]) 将get传入的参数c进行json解码并传入到数组中 !is_numeric判断是否为数值 count($c[n]) 计算$c[n]中的数组的元素的个数 is_array($c[n][0])判断$c[n][0]是否是一个数组 array_search 在数组中搜索某个健值并返回他的健名
经验还是欠缺看来还得多练习练习