题目链接
简单尝试
首先当然是去试试万能密码了,emmmm,全被过滤了......
试试弱口令呢?
admin | admin |
---|---|
admin | 123456 |
admin123 | admin123 |
... | ... |
然后,竟然还是弱口令.......(admin|admin123),但我岂能就这么放过它,嘿嘿,开始手注
题目给除了一些已经过滤的字符,通过尝试,发现并不是啊!!!因为我是用or,竟然也提示我非法字符?!?!!
所以,只能借用一下别的大佬的fuzz字典咯~~
查找过滤符号
判断执行语句
在一开始的尝试中,发现一共有三种返回状态:
- 非法字符
- 密码错误
- 用户名错误
所以,可以判断他是先检查用户名,在检查密码,所以可以从用户名下手~
既然布尔注入的字符都被无情的过滤了,但是!^
没有被过滤啊,所以想到使用异或进行注入
爆库名
- 构造payload:
admin'^(length(database())=3)^'
- 发现,只有在括号内的值为真时,才返回
username error
,所以数据库的长度为3.但是仍然不能做下去啊,因为or
和空格
啥的都被过滤了,可太难受了,但是!我偷偷瞄了一眼别的师傅的wp,当时我就傻眼了,竟然是靠表单属性猜......
直接猜passwd
的长度吧
-
因为数据库里保存密码很有可能以md5的形式保存,所以这里对密码的长度要长点,看到结果我当时就傻眼了...因为回显长度都是367..
-
没办法,一个一个看咯但也不是没办法嘛,枚举完后,从第一个开始按住方向下,看到username一闪而过,就往回找几个就找到了~~
-
知道
passwd
的长度是32了,看来是md5没错了,那就开始爆数据吧
爆passwd的数据
- 构造payload:
admin'^(ascii(substr((passwd),1,1))=48)^'
- emmmmm,逗号被过滤了,但是!没有关系,因为
substr(columns,start,step)==substr(columnsfrom(start)for(step))
- 但是之前尝试发现,for也被过滤了,所以只能使用
substr(columnsfrom(start))
,因为substr默认第三个参数是1,重新构造payload:admin'^(ascii(substr((passwd)from(1)))=48)^'
- 开始爆破:
- 虽然最后的数据长度都是一样的,但是比手工一点一点改快的多,只要按住方向下键,一直找就可以了,为了方便点,所以一定要先对payload1进行排序,再找
使用md5解码:
尝试登陆后台,拿到flag:
一共三种方法(目前我知道的)
- 弱口令
- post注入
- 源码泄露
- 通过工具直接拿到他的目录,然后下载flag文件,打开即可