目录:
首次写于:2021.2.22
补充于:2021.5.2
00000、知识点:
1.url传入数组绕过长度限制??
就是判断你输入字符串不能够太长的时候,
用数组可以进行绕过;
2.数组的遍历
两种遍历方法
foreach(array_expression as $value)
foreach(array_expression as $key => $value)
第一种格式便利,给定的 array_expression 数组。每次循环,当前单元的值被赋值给$value,并且数组内部的指针向前移动一步(因为下一次循环将会得到下一个单元)
第二种格式也是做相同的事情,只是除了当前单元的值赋给$value之外,键名也会在每次循环中被赋给变量$key。
<?php
$arr = array(1,2,3,4);
foreach ($arr as &$value){
//地址传参
$value = $value*2;
}
// array $arr now is (2,4,6,8)
unset($value);//销毁$value变量
<?php
$a = array(
"one"=>1,
"two"=>2,
"three"=>3,
"five"=>5
);
foreach ($a as $k => $v){
echo "\$a[$k]=>$v ";
}
输出:$a[one]=>1 $a[two]=>2 $a[three]=>3 $a[five]=>5
3.数组绕过正则
- md5(Array()) = null
- sha1(Array()) = null
- ereg(pattern,Array()) =null
- preg_match(pattern,Array()) = false
- strcmp(Array(), “abc”) =null
- strpos(Array(),“abc”) = null
- strlen(Array()) = null
一、自己做:
源码都弄下来了,但是分析,代码审计技能点还没有点,,,
懵逼中,
我看到了读取文件什么的,也看到了serialize和unserialize和session。
猜测可能是序列化和反序列化,应该不是session的序列化, 因为session不可控。
然后又关于数据库的操作。但是在尝试的时候,不报错,sql注入不是了,
二、学到的&&不足:
-
看到config.php里面的内容了,
我就没有反应过来flag再config.php中,,,,因为后面WP取flag就是取自config.php中的,我就愣是没反应过来, -
数组会绕过preg_match()。使得他匹配为
false
。 这里可以绕过。然后strlen
一个数组,会返货null
.。也可以的。 -
反序列化的话,我发现我还可以。
-
还有思路问题:我们上传的时候,photo是:
upload/3e602dd0ab83a3a8c3f32309bb9a88f9
这种样式,我当时还在思考,为什么,我们插入的数据是:s:10:"config.php"
。格式差别会这么大呢??这涉及到fie_get_contents()
。一个是我们方才上传的文件,另一个是已经存在的文件config.php
。 -
而且,看
config.php
那个内容,要想到flag
就在那里,结合file_get_contents()
。就要想到是读取文件, -
为什么 只有
nickname
可以注入呢????
前面两个都是 否定判断, 只有这个是肯定判断,所以也就只能够绕过nickname了。
这了提醒我以后审计代码要 细心!!!!!!!。这个也太细了把,,,我当时做这个题的时候都没有注意到。。
- 要提高的能力:
1. 本地复现能力!!!2. 代码调试,在浏览器端,**var_dump()**看输出3. 数据库 看 存储的信息。
四、学习WP
1.学习一个大佬的思路:
-
熟悉网站结构:
class.php里有一些重要的函数
update.php和profile.php中一个是上传文件,一个是获取文件,
最重要的是config.php。我们看到flag在里面。 -
根据前端流程 查看可疑函数
注册和登陆那块就不看了,主要的突破点是 上传资料 和 显示资料 这里。
首先是update.php
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
if($_POST['phone'] && $_POST['email'] &&