换一个theme

获取jacman,pacman主题的一个分支
git clone https://github.com/wuchong/jacman.git themes/jacman

配置_config.yml
theme: jackman 一定要有空格

# Stylus
stylus:
compress: true


使用jacman或pacman主题,建议按此标准语法写:

title: postName #文章页面上的显示名称,可以任意修改,不会出现在URL中
date: 2013-12-02 15:30:16 #文章生成时间,一般不改,当然也可以任意修改
categories: example #分类
tags: [tag1,tag2,tag3] #文章标签,可空,多标签请用格式,注意:后面有个空格
description: 附加一段文章摘要,字数最好在140字以内。


修改theme

hexo s启动服务器,然后即可变修改边预览,不需要hexo g

其实不算第一次,上次是imo系统脑残到找回密码时只需前台验证就可以,直接绕过了。

一直想搞某学校的网站。于是稍微多学了一点东西之后,又来这个网站逛。我想应该首先找留言、登录、上传的地方,上一次在主站登录的地方失利,这一次就找一找别的地方。

找到一个”教学资源库管理”,不过是另一个地址了,估计是另一个主机吧。进去之后发现很酷炫,有很多不该有的功能(一个教学资源库管理平台为什么要还有山寨vmware workstation呢?)去查了一下,是一个厦门大学的硕士生写的。OrZ。

弱密码admin,admin,OrZ,我总是不相信会有这些不可思议的傻逼。

可以上传文件。试了一下,可以上传php文件。含有xss代码的html文件是可以正常访问的,但是没有意义,因为这个数据库是和主站独立的,并且这个网站根本没人用。但是不能正确获取上传上去的php文件的地址(确认是上传成功的,因为能下载下来,只是访问的时候显示404)。于是我去找这个系统的源码,打算审计一下,无奈下载下来的代码和实际的这个很不一样。

于是另寻他路,这个系统有太多功能了,于是我一个一个地看。。看到有预览功能,还可以自己改代码。。我就添加了一项php,发现它的预览功能其实是用html来包装,所以感觉没什么余地。

我想是不是.htaccess限制了不能跨域访问php文件(其实是我想多了,高估了这个网管),于是我想是不是要上传一个写了ajax的html上去,那样的话,就有点麻烦了。

后来得到室友的提醒(其实他也只是说了是不是限制了可以执行的类型,不过不知为何我的脑洞被打开了)。其实只是这台服务器没有装php,运行不了而已,所以显示404,不是限制了。这个系统也是asp的。于是上传了一个asp的web shell上去,能成功打开了。

nmap扫描了一下,发现3389端口开着。

kow用菜刀帮我建立了管理员账号,我自己用这个web shell老是不成功,不知道为什么。并且在他的vps上连接上了。貌似一般没有开3389端口时都需要lcx反弹来远控(也就是端口转发。在远端运行一个lcx的监听进程)

kow告诉我这些webshell都是有后门的,以后只好再另寻他路。

第一次撸站成功,好有成就感。


“( ゜- ゜)つロ

Attack the NEET Princess
Time Limit: 9000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu
Submit

Status

Description
Houraisan Kaguya (蓬萊山輝夜) is the NEET (not in education, employment or training) princess living in Eientei (永遠亭). She is an unemployed geek, who sits at home and surfs the Internet all day. But today is different, as the Hakurei Shrine Reitaisai Festival (博麗神社例大祭) will be hosted in Hakurei Shrine, Kaguya decides to go to buy some new doujin games.

Fujiwara no Mokou (藤原妹紅) detests Kaguya, and has been planing to attack her for a long time. But she nerver got the chance before because Kaguya kept staying in Eientei, under the protection of Yagokoro Eirin (八意永琳). Knowing that Kaguya will go outside today, Mokou decides to wait on certain road and attack her once she passes there. Mokou don’t know which path Kaguya will choose, but she thinks that there always exits some roads where she can always meet Kaguya.

Input
There are multiple cases. Each case begins with two integers 2 ≤ n ≤ 10000 — the number of villages and 2 ≤ m ≤ 100000 — the number of roads. Then m lines, each contains two integers a and b (0 ≤ a, b < n), indicating a road connecting village a and village b. Village 0 is Eientei and Village n-1 is Hakurei Shrine. They are always connected by roads. There may be more than one roads between two villages.

Output
Find out the roads where Mokou can always meet Kaguya. For each case, output the number of roads in the first line, then output the numbers of the roads in ascending order in the second line.

Sample Input
3 2
0 1
1 2

7 8
0 1
0 2
1 3
2 3
3 4
3 5
4 6
5 6

Sample Output
2
0 1
0

无向图找桥,再筛选一下桥,筛选的时候,注意到新的图变成了一棵树,因此遍历一次树即可,不需要回溯

#include<cstdio>
#include<algorithm>
#include<cstring>
using std::sort;
const int N=10010;
const int M=100010;

struct EDGE
{
    int v,next,i;
};
EDGE edge[M*2],edge2[M*2];
bool vis[N];

int first[N],low[N],dfn[N],belong[N],degree[N],sta[M],instack[M],first2[N];
int g,cnt,top,scc,g2;
int min(int a,int b)
{
    return a<b?a:b;
}
void AddEdge(int u,int v)
{
    edge[g].v=v;
    edge[g].next=first[u];
    first[u]=g++;
}
void AddEdge2(int u,int v,int i)
{
    edge2[g2].v=v;
    edge2[g2].i=i;
    edge2[g2].next=first2[u];
    first2[u]=g2++;
}
void Tarjan(int u,int fa)
{
    int i,v;
    low[u]=dfn[u]=++cnt;
    sta[++top]=u;
    instack[u]=1;
    for(i=first[u];i!=-1;i=edge[i].next)
    {
        v=edge[i].v;
        if(i==(fa^1))
            continue;
        if(!dfn[v])
        {
            Tarjan(v,i);
            low[u]=min(low[u],low[v]);
        }
        else if(instack[v])
            low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        scc++;
        while(1)
        {
            v=sta[top--];
            instack[v]=0;
            belong[v]=scc;
            if(v==u)
                break;
        }
    }
}

int que[M];
int rear = 0;
void output(int a){
    que[rear++] = a;
}

int n,m;
bool dfs(int u,int fa){
    int i,v;
    vis[u] = true;
    if (u == belong[n])
        return true;
    for(i=first2[u];i!=-1;i=edge2[i].next)
    {
        //printf("%d\n",i);
        v=edge2[i].v;
        if (vis[v])
            continue;
        if(i==(fa^1))
            continue;
        if (dfs(v,i)){
            output(edge2[i].i);
            return true;
        }
    }
    return false;
}

int _edge[M][2];

int main()
{
    int u,v,i;
    while (~scanf("%d%d",&n,&m)){
        g=cnt=top=scc=0;
        memset(first,-1,sizeof(first));
        memset(low,0,sizeof(low));
        memset(dfn,0,sizeof(dfn));
        memset(instack,0,sizeof(instack));
        memset(degree,0,sizeof(degree));
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            {
                u ++;
                v ++;
                _edge[i][0] = u;
                _edge[i][1] = v;
                AddEdge(u,v);
                AddEdge(v,u);
            }
        }
        for(i=1;i<=n;i++)
            if(!dfn[i])
                Tarjan(i,-1);

        //printf("DEBUG %d\n",scc);
        memset(first2,-1,sizeof(first2));
        g2 = 0;
        for (i=0;i<m;i++){
            int u = belong[_edge[i][0]];
            int v = belong[_edge[i][1]];
            AddEdge2(u,v,i);
            AddEdge2(v,u,i);
        }
        memset(vis,0,sizeof vis);
        rear = 0;
        dfs(belong[1],-1);

        sort(que,que+rear);
        printf("%d\n",rear);
        //if (rear > 0)
        {
            for (i=0;i<rear;i++){
                printf("%d",que[i]);
                if (i < rear-1)
                    printf(" ");
            }
            printf("\n");
        }
    }
    /*
       for(i=1;i<=n;i++)
       {
       for(j=first[i];j!=-1;j=edge[j].next)
       {
       v=edge[j].v;
       if(belong[i]!=belong[v])
       degree[belong[i]]++;
       }
       }
       int sum=0; for(i=1;i<=n;i++)
       if(degree[i]==1)
       sum++;
       int ans=(sum+1)/2;
       printf("%d\n",ans);
     */
    return 0;
}

0x00 Cake

异或加密

0x01 绕过云WAF1

总结别人的思路:

域名md5解码后是cdn,暗示此题要求找出背后真正的IP。

  1. 方法一: http://zone.wooyun.org/content/18058.
    1. 上apnic上过滤出全中国的ip段
    2. 使用zmap扫描所有ip的80端口
    3. 使用zmap的example的banner-grab对扫描出来的ip进行banner抓取.由于是要绕过cdn,因此http-req里host应该填对外的这个域名(我不知道改怎么叫它).
    4. 过滤出banner相似的页面,用一定关键字,比如alictf
      这样大面积撒网找到真正的ip.缺点是太慢,而且apnic上抓的数据要求够新.而且我至今没有得到一个正确的结果。。。
  2. 方法二:
    1. 由于提示说了在.alictf.com的子域名下,所以可以尝试fuzz子域名.
    2. 我找了一个什么基于google的什么鬼字典,3w条记录.fuzz到video.alictf.com.和前一种方法结果差不多.
      找到之后还可以放进hosts解析.
      还有一种方法叫全球ping,算是一种暴力方法吧,按照cdn的本质.
      绕过了WAF之后,可以sqlmap注入,不知道为什么我一直不成功.

0x02 前端初赛题1: http://drops.wooyun.org/tips/3059

xss。点号,括号,等于号都被过滤掉,html标签不会被过滤。\\标签内的内容会被解html编码,于是我们用svg来包装.由于我不明白的原因(也许是仍然会被过滤),还需要再把中间的内容urlencode一次.

0x03 前端初赛题2: http://drops.wooyun.org/tips/2924

要导致url手工解析和库函数解析的结果不同

  1. 思路一:不通过url传参,用html加载flash,用FlashVars传参,我没有尝试过。不能成功。
  2. 思路二:http://drops.wooyun.org/papers/948。flash会丢弃两个出现在%后面的无效十六进制字符。这样可以导致手工通过找%来parse的方法比正常情况多出几个字符。
    由于swf运行在虚拟机上,异常会显示在console里,我们可以根据这个反馈信息来构造我们的xss,首先闭合掉括号,然后append一个img,然后补上catch,然后注释掉剩余字符。

0x04 前端初赛题3:

审计js代码。首先很容易实现认证为notexist.example.com,而url为更长的内容。
我尝试构造出notexist.example.com,而url为xss,失败了。
原来是利用@的功能,@之前用:隔开用户名和密码。会被自动截掉,剩余部分是最终url。
同样可以根据console来修改xss。
参考别人的writeup分析流程:
将第一个@前面的内容作为基础认证信息,之后的内容作为域名:端口。
但是如果最后一个:之后不是数字,而是@domain.com,浏览器会把这一部分作为域名,之前的部分作为基础认证信息,绕过检查,加载自己域名下的JS。

0x05 简单业务逻辑:

注册覆盖Admin,购买的时候抓包,修改数量为负数。

0x06 谁偷了你的站内短信

这道题相当简单了,格式化字符串漏洞。可惜getFlag函数被我忽略了。
格式化字符串有点麻烦的地方是,不能出现0x0,即使是高位为0的整数。
不过这道题不用考虑这么多,我的ROP链也不知到哪里不对,不能越过DEP。这道题只需要跳到getflag,甚至不用恢复栈。
参考别人的代码时,发现用readUntil比我写的sleep好多了,这样更有可控性。zio也是一个挺好的工具。

0x07 密码宝宝

upx -d脱壳后任然不能调试。(有人说在xp下就能调试了。。。什么时候研究一下根据esp手动脱壳。。)。花指令很多,很难静态分析。在GetWindowTextA下断点,然后跟到用户代码。别人好多都是关注堆的变化,最后flag明文写在堆里。这样的话,我确实走了很多弯路,最后是根据逻辑算出来的flag。

0x08 渗透绕过WAF2

提示需要内部访问,于是 fuzz IP:
. 192.168.x.x
. 10.x.x.x
. 172.16.x.x
这个叫什么特殊ip,最近课上学了。还没太搞明白。
10开头的可以访问,然后注入,不知道为什么一直不能获得information_schema里的信息,然而版本又是>=5.5,不懂了。T_T。。

好多题比赛结束后就做不了了,有的题很好,可惜了。以后需要多看一下知识库。