遇到一个写脚本的CTF了,刚刚开始我还以为需要SQL注入之类的,但是分析网页源码发现没有action操作,应该是本文件自己提交,自己验证的!具体情况如下:
访问IPhttp://106.75.26.211:2222/
呃呃呃~很简单的页面,只有一个login的登录按钮,网页源码没有什么特别的,所以直接访问下一个页面,看看有什么妖气!
一个登录页面,经过分析,就像刚开始所说的一样,但是页面中有一个验证码函数,但是经过md5加密后只给我们返回了前面六位数;这样来看我一开始就错了,原因是,输入验证码一直都是错的,输入的一直都是他加密后的前六位,所以我需要写脚本爆破这个验证码:
思路是:只给我们验证码md5加密后的前六位,验证码是多少位不知道,纯数字?还是有字母,都没有告诉我们,所以就先预计只是纯数字,位数不知道,但是通常是4位数以上,所以就先谢谢。python脚本!
# coding:utf-8
import hashlib
list='0123456789'
for a in list:
for b in list:
for c in list:
for d in list:
for e in list:#5位数
for f in list: # 6位数
for g in list: # 7位数
str4=(a+b+c+d+e+f+g)
value = hashlib.md5(str4)
value1 = value.hexdigest()
#print (value1)
s4 = value1[0:6]
# print (s1)
if s4 == '3d5e20':#写入从页面中获取6位数
print ('end'+ str4)
脚本很简单,创建一个list字符串集,使用for循环,先循环4次,然后将这四个数字拼接起来,使用md5加密,加密后截取前面6个数字,然后将这六个数字和网页给我们的数字相互比较,如果相等,就输出结果;就这样我从循环4次一直循环了7次,才得出比较靠谱的结果,但是结果也不确定,需要多试几次才行;
如:我这里给我的前6位是“9c31b8”,那么就将这数字,带入代码中爆破,但是可能会得出多个结果,需要我一个一个的试,或许提交之后是错误error”,就需要重新刷新页面,获取新的6位数,带入到代码中来重新爆破,虽然很麻烦,但是总会得出结果,做CTF需要的是耐心,需要各种分析,各种尝试。
接下来就填写爆破出的验证码,这里不知道username,password,但是可以使用万能密码来试试!username:admin’ or ‘1’ =’1 password:随便写
很幸运提交成功了!
当弹出提示框了,就成功登陆了!
页面返回了一个可以下载文件的列表!先不管这是神马,把所有文件下载到本地再说!然后一个一个的看!其中a.php中有提示:
flag.php在网站根目录下!访问一下,是可以访问的
这里该怎么做呢?这里不是文件包含,不能使用文件流读取文件了!但是这里有下载文件,那么就将这个文件直接下载下来吧!获取下载文件的路径:http://106.75.26.211:2222/file/download.php?f=a.php直接下载flag.php文件试试?
发现这样下载不得行!什么原因呢?flag.php在根目录,但是这里不是在根目录!所以要返回到根目录去下载:
提示不对,没有下载下来,这是为什么呢?应该是做了限制,那么我就直接用绝对路径试试!那么绝对路径是什么呢?先看看有没有phpinfo.php
这里没有phpinfo.php,但是返回的信息很有用!这是Ubuntu的系统,Apache的服务器,所以路径很好找了:/var/www/html 然后我们就访问flag.php并下载。
胜利在望了,查看flag.php源码,看看有什么:
这是源码,源码告诉我,需要传递一个flag参数,然后进行过滤,如果flag=flag,就可以获取flag了。
但是没有返回任何东西!换一个工具试试,burpsuite试试:
flag后面需要添加分号!才能返回flag