HCTF2014 部分write up
1 查看网页源代码提示index.php.bak
,下载下来源代码如下
1<?php
2$flag='xxx';
3extract($_GET);
4if(isset($gift))
5{
6 $content=trim(file_get_contents($flag));
7 if($gift==$content)
8 {
9 echo'hctf{...}';
10 }
11 else
12 {
13 echo'Oh..';
14 }
15}?>
很明显,这里存在变量覆盖漏洞,构造参数gift为本文件内容,flag=index.php.bak
或者两个参数都留空就可以得到flag。
关于这个漏洞可以参考 http://zone.wooyun.org/content/1872
2 easy xss
初步构造xss 111@qq.com<script src="**"></script>
然后提交的时候提示必须是邮箱地址,F12干掉检测代码,提交上去。
但是响应是一个alert 提交Email内容为:111@qq.com< ="**"></>,管理员会很快登录查看的!
这样的话貌似是后台过滤了script和src,调整了一下大小写还是不行,后来就换成了css import的时候的一个xss @import url("***")
后来成功获取到了cookies(其实这一句话还有很多艰辛,原先自己写了一个xss平台,但是现在用一时半会没法部署,找了一个第三方的还什么都收不到,最终还是临时写了一个很简单的),获取到了cookies之后搜了搜是eyou邮件系统的,但是这个怎么去利用呢?
陷入了僵局,先去看看管理后台是什么样子的吧,直接访问提示ip不允许,把http头修改成了xss获取到的那个ip之后发现后台什么都没有,就是一个页面不断的自动刷新。。。
这时候回到主页上去,发现有一个图片显示的很奇怪,http://121.41.37.11:25045/img.php?file=1.jpg
,一般没有这么用的吧。顺手把1.jpg
换成了2.jpg
,出来了一个命令行的截图,不过不完整,但是这样还是很快就认出来了这就是sqlmap的,原来是这里有注入~~使用sqlmap注入file参数获取到了管理员用户名,还是伪造ip登陆后台获取到了flag。
3 NormalFile
首先使用linux命令strings
查看文件内有没有什么可疑字符串,后来发现出了常规的图片文件信息外貌似还有一些类似文件路径的东西,可能是文件隐写,尝试解压,提示错误,后来在windows上解压才成功的。然后就获取到了一个相同的图片,使用同样的方法,继续解压,得到一个安卓的apk。因为对安卓平台不熟悉,直接grep -r "flag"
发现确实存在这个字符串,但是没有实际的flag,尝试逆向之后获取的java代码是在看不懂了
1// Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov Date: 2014/11/8 21:49:13
2// Home Page: http://members.fortunecity.com/neshkov/dj.html http://www.neshkov.com/dj.html - Check often for new version!
3// Decompiler options: packimports(3)
4
5package cc.hctf.babytrick;
6
7import android.os.Bundle;
8import android.os.Environment;
9import android.support.v7.a.f;
10import android.view.Menu;
11import android.view.MenuItem;
12import android.widget.Button;
13import android.widget.Toast;
14import java.io.*;
15
16// Referenced classes of package cc.hctf.babytrick:
17// a
18
19public class Main extends f
20{
21
22 public Main()
23 {
24 }
25
26 static boolean a(Main main, String s)
27 {
28 return main.b(s);
29 }
30
31 private boolean b(String s)
32 {
33 String s1 = (new StringBuilder()).append(Environment.getExternalStorageDirectory().getPath()).append("/brand.txt").toString();
34 try
35 {
36 FileInputStream fileinputstream = new FileInputStream(new File(s1));
37 BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(fileinputstream));
38 s = (new StringBuilder()).append(s).append(bufferedreader.readLine()).toString();
39 bufferedreader.close();
40 fileinputstream.close();
41 }
42 catch(FileNotFoundException filenotfoundexception)
43 {
44 Toast.makeText(getApplicationContext(), "I'm sorry to hear that you never try my favorite brand :(", 0).show();
45 }
46 catch(IOException ioexception)
47 {
48 Toast.makeText(getApplicationContext(), "Oh... Why don't you try that? :(", 0).show();
49 }
50 char ac[];
51 if(s != null && s.length() == 16)
52 if((ac = s.toCharArray())[15] == ac[13] && ac[4] == ac[9] && ac[5] == ac[8] && ac[7] == ac[10])
53 {
54 String s2 = (new StringBuilder()).append("").append(s.charAt(0)).append(s.charAt(4)).append(s.charAt(8)).append(s.charAt(12)).append(s.charAt(1)).append("++").append(s.charAt(13)).toString();
55 int ai[] = {
56 112, 83, 93, 112, 28, 0, 87, 91
57 };
58 char ac1[] = new char[8];
59 for(int i = 0; i < 8; i++)
60 ac1[i] = (char)(s2.toCharArray()[i] ^ ai[i]);
61
62 if((new StringBuilder()).append("").append(s.charAt(2)).append(s.charAt(6)).append(s.charAt(10)).append(s.charAt(14)).append(s.charAt(3)).append('+').append(s.charAt(11)).append('+').toString().equals(new String(ac1)))
63 {
64 Toast.makeText(getApplicationContext(), (new StringBuilder()).append(":) I'm happy to see your favorite toast is just the same as me:hctf{").append(s).append('}').toString(), 0).show();
65 return true;
66 }
67 }
68 return false;
69 }
70
71 protected void onCreate(Bundle bundle)
72 {
73 super.onCreate(bundle);
74 setContentView(0x7f030018);
75 Button button = (Button)findViewById(0x7f07003d);
76 button.setOnClickListener(new a(this, button));
77 }
78
79 public boolean onCreateOptionsMenu(Menu menu)
80 {
81 return true;
82 }
83
84 public boolean onOptionsItemSelected(MenuItem menuitem)
85 {
86 if(menuitem.getItemId() == 0x7f070040)
87 return true;
88 else
89 return super.onOptionsItemSelected(menuitem);
90 }
91}