[CISCN2019 华东南赛区]Double Secret(RC4加密)

我们打开页面,同时要我们寻找secret,

这就很明显了吧,我们访问secret页面

image-20240619210204964

然后页面提示要我们输入secret的值,那不就是传参嘛,我们随便传一个值

题解

[SUCTF 2019]EasyWeb(异或rce,.htaccess文件上传)

我们打开页面,发现好大一串代码,我们进行代码审计

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
<?php
function get_the_flag(){
// webadmin will remove your upload file every 20 min!!!!
$userdir = "upload/tmp_".md5($_SERVER['REMOTE_ADDR']);
if(!file_exists($userdir)){
mkdir($userdir);
}
if(!empty($_FILES["file"])){
$tmp_name = $_FILES["file"]["tmp_name"];
$name = $_FILES["file"]["name"];
$extension = substr($name, strrpos($name,".")+1);
if(preg_match("/ph/i",$extension)) die("^_^");
if(mb_strpos(file_get_contents($tmp_name), '<?')!==False) die("^_^");
if(!exif_imagetype($tmp_name)) die("^_^");
$path= $userdir."/".$name;
@move_uploaded_file($tmp_name, $path);
print_r($path);
}
}

$hhh = @$_GET['_'];

if (!$hhh){
highlight_file(__FILE__);
}

if(strlen($hhh)>18){
die('One inch long, one inch strong!');
}

if ( preg_match('/[\x00- 0-9A-Za-z\'"\`~_&.,|=[\x7F]+/i', $hhh) )
die('Try something else!');

$character_type = count_chars($hhh, 3);
if(strlen($character_type)>12) die("Almost there!");

eval($hhh);
?>

我们可以发现代码最后要进行命令执行,但对我们的参数内容进行了过滤,所以为无字母数字rce,我们可以用取反、自增、异或来构造我们所需代码,但由于长度进行了限制,我们不能通过取反和自增来进行命令执行,我们只能用异或

题解文件上传

[HarekazeCTF2019]encode_and_encode

我们进行代码审计

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
<?php
error_reporting(0);

if (isset($_GET['source'])) {
show_source(__FILE__);
exit();
}

function is_valid($str) {
$banword = [
// no path traversal
'\.\.',
// no stream wrapper
'(php|file|glob|data|tp|zip|zlib|phar):',
// no data exfiltration
'flag'
];
$regexp = '/' . implode('|', $banword) . '/i';
if (preg_match($regexp, $str)) {
return false;
}
return true;
}

$body = file_get_contents('php://input');
$json = json_decode($body, true);

if (is_valid($body) && isset($json) && isset($json['page'])) {
$page = $json['page'];
$content = file_get_contents($page);
if (!$content || !is_valid($content)) {
$content = "<p>not found</p>\n";
}
} else {
$content = '<p>invalid request</p>';
}

// no data exfiltration!!!
$content = preg_replace('/HarekazeCTF\{.+\}/i', 'HarekazeCTF{&lt;censored&gt;}', $content);
echo json_encode(['content' => $content]);

代码要求我们输入json格式的数据,然后进行过滤,将结果传入file_get_contents进行读取

我们来看is_vaild方法,它将一大堆伪协议进行了过滤

我们知道json_decode会将\uxxx进行转义,这样就可以绕过is_valid检测

题解

[网鼎杯 2018]Comment(git源码修复&二次注入)

打开页面,发帖发现需要登录,账号给了,密码还有三位数没给

image-20240616160714183

我们进行爆破

sql注入

[NPUCTF2020]ezinclude(php7 segment fault特性)

我们打开源码,发现页面有个提示

image-20240616141533744

1
md5($secret.$name)===$pass

我们输入url

1
/?name=1

变化name的值,发现cookies的hash在不断变化,说明hash的值跟name的取值有关,但又不完全是name的值,说明cookie的hash很有可能就是md5的值

php特性

[NCTF2019]SQLi(regexp&%00截断)

我们先对题目进行扫描,发现扫出来个robots.txt

我们进行访问

image-20240614195933329

出现黑名单和得到flag的条件,我们要获得admin账号的密码

我们可以注意到没有对\进行过滤,空格过滤可以替换为`/**/,末尾多出的 ‘ 可以用%00截断,所以我们可以构造如下payload来使查询为真

sql注入