您的位置:首页 > 数据库

2016百度杯12月第四场挑战赛解题过程记录

2017-02-27 17:40 816 查看
这题从入门,到放弃,使用了一天时间,里面关于sql注入的套路比较深,故记录下解题过程,并和WP作了一定的结合。
百度杯比赛链:http://www.ichunqiu.com/racing/ctf_56951
首先访问链接得到了一个Mini-Blog的欢迎页面:



注册一个账号: admin/pass;



发现注册失败,尝试更改一个用户名注册,于是使用aaa/aaa:

注册成功并登陆

登陆成功后可以看到有一个写blog的编辑框,风格看起来比较像某editor.



尝试编辑器上传附件功能,发现上传功能损坏,但是爆出了编辑器是kindeditor:



百度了一下kindeditor是一款开源富文本编辑器,于是从github上找到了kindeditor的源码~~



读完kindeditor源码后,发现file_manager_json.php中存在一个目录遍历的参数path,
于是在题目上尝试构造目录访问,果然列出了当前目录,由此搞清了整个网站的目录,同时发现目标flag.php就位于网站根目录下。

payload1:
http://8de5ac46d36747d4931177c2a8dea5479cb06fcf9e154f0a.ctf.game/kindeditor/php/file_manager_json.php?path=../



尝试访问flag.php提示flag就在这里,那么目标就清晰了:如何能够读flag.php的内容;

经过多个位置的尝试,在写blog的那个输入框位置发现了一个注入漏洞。

test-payload: '=' 返回值为1,1'=' 返回值为0,测出注入,那么问题就在于如何注入了,
通过分析不难确定此处应是一条insert语句用以保存用户所写blog到数据库中,对这个位置比赛平台过滤的比较严密(被各种套路), union select 等试了比较多次,但是都被过滤掉了。
猜想后台sql语句形似:

INSERT INTO TABLENAME(A,B,C) VALUES($A,$B,$C);
我们能控制的变量应该有2-3个,分别是用户名/id,blog标题和blog内容;
接下来就是比较难想的一个注入方法了,在这里主要有两个思路,因为insert语句本身不会有回显,而网站的报错都被屏蔽掉了,所以布尔盲注明显不能够成立,那么只有

套路1: select '一句话' into oufile '某.php' 通过数据库将一句话写入某个php,然后连webshell
套路2: insert 语句上做手脚,虽然insert语句本身没有回显,但是插入的blog会紧接着显示在第二页的bloglist上面,由此即便插入某些特别的东西也是可以显示的。
这里涉及到insert语句的插入细节:

套路1由于防火墙的存在而不能够使用,由此只能考虑套路2.
insert into tableA values(A1,B1,C1), (A2,B2,C2) 这句话即将两个不同的元组插入到tableA中,这个很久不用了结果忘记了。。导致没能成功利用套路2.

测试payload:



content这么写的意思很明确,我猜测insert语句的值类似于: (username,title,content)
于是这里构造的insert语句类似于 ... values('aaa','testpayload2','test')#注释掉了
这个payload过去报错了,这说明猜测的insert字段有误,既然不是三个,更不可能是两个,受控制的部分已经有两个了,因此推测insert语句的字段数为4.
test-payload3:
title=testpayload3&content=test','X')#
提交,不报错顺利通过,得到验证,insert语句的四个字段可能为(username, title,content,X) X未知不过无关紧要
接下来就是利用insert语句多条插入的时候了,之所以要用多条插入,一是content字段的上下文不完全控制在自己手里,联合查询又不能用,insert的限制条件还是非常苛刻的,另外我们发现将X字段控制在自己手里的时候插入进去的blogcontent居然不会显示出来,这个坑真的是。。坑,所以保持第四字段不动,新建一条插入项,
将真正的payload放在第二条插入语句中:

real_payload: title=payload&content=test','X'),('aaa',(SELECT group_concat(password) from users),'content

这样即在不影响第二条payload的X字段的情况下将整个insert语句闭合了,成功插入,这条insert即将users表中的password项全部select出来,不要问我表名和列名是怎么得到的,这么常规你就不造爆破一下么)



于是取得了两个的md5,拿去反解一下,一个是aaa,一个是melody123
拿admin/melody123尝试登陆一下网站,发现用到了一个manager.php的页面,
于是不能是别的那只能是必须是..php文件包含了,一个LFI,正好前几天看了表姐的笔记,用php://filter读一波flag.php,终结。。

final_payload:

http://8de5ac46d36747d4931177c2a8dea5479cb06fcf9e154f0a.ctf.game/blog_manage/manager.php?module=php://filter/read=convert.base64-encode/resource=../flag&name=php

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CTF sql注入 安全