2016百度杯12月第四场挑战赛解题过程记录
2017-02-27 17:40
816 查看
这题从入门,到放弃,使用了一天时间,里面关于sql注入的套路比较深,故记录下解题过程,并和WP作了一定的结合。
百度杯比赛链:http://www.ichunqiu.com/racing/ctf_56951
首先访问链接得到了一个Mini-Blog的欢迎页面:
![](https://img-blog.csdn.net/20170227174148475?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注册一个账号: admin/pass;
![](https://img-blog.csdn.net/20170227174222726?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
发现注册失败,尝试更改一个用户名注册,于是使用aaa/aaa:
注册成功并登陆
登陆成功后可以看到有一个写blog的编辑框,风格看起来比较像某editor.
![](https://img-blog.csdn.net/20170227174259789?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
尝试编辑器上传附件功能,发现上传功能损坏,但是爆出了编辑器是kindeditor:
![](https://img-blog.csdn.net/20170227174318658?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
百度了一下kindeditor是一款开源富文本编辑器,于是从github上找到了kindeditor的源码~~
![](https://img-blog.csdn.net/20170227174347689?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
读完kindeditor源码后,发现file_manager_json.php中存在一个目录遍历的参数path,
于是在题目上尝试构造目录访问,果然列出了当前目录,由此搞清了整个网站的目录,同时发现目标flag.php就位于网站根目录下。
payload1:
http://8de5ac46d36747d4931177c2a8dea5479cb06fcf9e154f0a.ctf.game/kindeditor/php/file_manager_json.php?path=../
![](https://img-blog.csdn.net/20170227174410783?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
尝试访问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:
![](https://img-blog.csdn.net/20170227174430229?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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出来,不要问我表名和列名是怎么得到的,这么常规你就不造爆破一下么)
![](https://img-blog.csdn.net/20170227174445659?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzAxMjMzNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
于是取得了两个的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
百度杯比赛链: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
相关文章推荐
- 百度杯12月第四场Blog进阶版解题过程记录
- 记录一下使用百度Ueditor副编辑器的过程及碰到的问题
- 计蒜客 2016计蒜之道比赛 初赛第四场 记录
- DRML(2016-CVPR)重现过程记录---(10)代码上传
- hdu4318 Power transmission 最短路 当数据很大的时候的解决办法 一道题目的解题全过程记录 小水
- DRML(2016-CVPR)重现过程记录---(8)问题定位_3
- DRML(2016-CVPR)重现过程记录---(7)问题定位_2
- HTTP的会话有四个过程,请选出不是的一个()----百度2016研发工程师笔试题(六)
- 【001】快乐数字解题过程记录
- DRML(2016-CVPR)重现过程记录---(9)问题解决与最终结果
- DRML(2016-CVPR)重现过程记录---(4)问题与反思
- 二叉树 判断是否为子树解题报告 (百度2016暑期实习笔试)
- 百度定位服务使用过程中的异常信息记录及解决方案
- DRML(2016-CVPR)重现过程记录---(2)数据预处理
- DRML(2016-CVPR)重现过程记录---(6)新的尝试与思考-tensorflow?
- DRML(2016-CVPR)重现过程记录---(5)问题定位_1
- 微信支付2016开发调试过程记录
- DRML(2016-CVPR)重现过程记录---(3)训练模型
- 小菜鸟弄百度cafe过程中遇到的问题记录
- [容斥系数 记录状态DP] 2016 计蒜之道 初赛 第四场 遗失的支付宝密码