Sqli-labs之sql注入基础知识
(1)注入的分类
基于从服务器接收到的响应
▲基于错误的SQL注入
▲联合查询的类型
▲堆查询注射
▲SQL盲注
•基于布尔SQL盲注
•基于时间的SQL盲注
•基于报错的SQL盲注
基于如何处理输入的SQL查询(数据类型)
•基于字符串
•数字或整数为基础的
基于程度和顺序的注入(哪里发生了影响)
★一阶注射
★二阶注射
一阶注射是指输入的注射语句对WEB直接产生了影响,出现了结果;二阶注入类似存储型XSS,是指输入提交的语句,无法直接对WEB应用程序产生影响,通过其它的辅助间接的对WEB产生危害,这样的就被称为是二阶注入.
基于注入点的位置上的
▲通过用户输入的表单域的注射。
▲通过cookie注射。
▲通过服务器变量注射。 (基于头部信息的注射)
url编码:一般的url编码其实就是那个字符的ASCII值得十六进制,再在前面加个%
具体可以看http://www.w3school.com.cn/tags/html_ref_urlencode.html,这里可以查到每个字符的url编码,当然自己编程或者用该语言应该也有自带的函数,去实现url编码
常用的写出来吧: 空格是%20,单引号是%27, 井号是%23,双引号是%22
判断sql注入(显错和基于错误的盲注):单引号,and 1=1 和and 1=2,双引号,反斜杠,注释等
判断基于时间的盲注:在上面的基础上,加个sleep函数 ,如sleep(5) (函数不同数据库有所不同)例子: ' and sleep(5) " and sleep(5)
(2)系统函数
常用函数:
1. version()——MySQL版本
2. user()——数据库用户名
3. database()——数据库名
4. @@datadir——数据库路径
5. @@version_compile_os——操作系统版本
(3)
字符串连接函数
函数具体介绍: http://www.cnblogs.com/lcamry/p/5715634.html
- concat(str1,str2,...)——没有分隔符地连接字符串
- concat_ws(separator,str1,str2,...)——含有分隔符地连接字符串
- group_concat(str1,str2,...)——连接一个组的所有字符串,并以逗号分隔每一条数据
(4)
一般用于尝试的语句
Ps:--+可以用#替换,url提交过程中Url编码后的#为%23
or 1=1--+
'or 1=1--+
"or 1=1--+
)or 1=1--+
')or 1=1--+
") or 1=1--+
"))or 1=1--+
一般的代码为:
id=_GET['id'];
$sql="SELECT *
FROM users WHERE id='$id' LIMIT 0,1";
此处考虑两个点,一个是闭合前面你的 ' 另一个是处理后面的 ' ,一般采用两种思路,闭合后面的引号或者注释掉,注释掉采用--+ 或者 #(%23)
(5)
union操作符的介绍
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s)
FROM table_name1
UNION
SELECT column_name(s)
FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s)
FROM table_name2
另外,UNION
结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
(6)sql中的逻辑运算
提出一个问题Select * from users where id=1 and 1=1; 这条语句为什么能够选择出id=1的内容,and 1=1到底起作用了没有?这里就要清楚sql语句执行顺序了。
同时这个问题我们在使用万能密码的时候会用到。
Select * from admin
where username='admin' and password='admin'
我们可以用 'or 1=1# 作为密码输入。原因是为什么?
这里涉及到一个逻辑运算,当使用上述所谓的万能密码后,构成的sql语句为:
Select * from admin
where username='admin' and password=''or 1=1#'
Explain:上面的这个语句执行后,我们在不知道密码的情况下就登录到了admin用户了。
原因是在where子句后,我们可以看到三个条件语句 username='admin' and password=''or 1=1。三个条件用and和or进行连接。在sql中,我们and的运算优先级大于or的元算优先级。因此可以看到 第一个条件(用a表示)是真的,第二个条件(用b表示)是假的,a and b = false,第一个条件和第二个条件执行and后是假,再与第三个条件or运算,因为第三个条件1=1是恒成立的,所以结果自然就为真了。因此上述的语句就是恒真了。
①Select
* from users where id=1 and 1=1;
②Select
* from users where id=1 && 1=1;
③Select
* from users where id=1 & 1=1;
上述三者有什么区别?①和②是一样的,表达的意思是 id=1条件和1=1条件进行与运算。
③的意思是id=1条件与1进行&位操作,id=1被当作true,与1进行 & 运算 结果还是1,再进行=操作,1=1,还是1(ps:&的优先级大于=)
Ps:此处进行的位运算。我们可以将数转换为二进制再进行与、或、非、异或等运算。必要的时候可以利用该方法进行注入结果。例如将某一字符转换为ascii码后,可以分别与1,2,4,8,16,32.。。。进行与运算,可以得到每一位的值,拼接起来就是ascii码值。再从ascii值反推回字符。(运用较少)
(7)注入流程
我们的数据库存储的数据按照上图的形式,一个数据库当中有很多的数据表,数据表当中有很多的列,每一列当中存储着数据。我们注入的过程就是先拿到数据库名,在获取到当前数据库名下的数据表,再获取当前数据表下的列,最后获取数据。
现在做一些mysql的基本操作。启动mysql,然后通过查询检查下数据库:
show databases;
这个实验用到的数据库名为security,所以我们选择security来执行命令。
use security;
我们可以查看下这个数据库中有哪些表
show tables;
现在我们可以看到这里有四张表,然后我们来看下这张表的结构。
desc emails;
在继续进行前台攻击时,我们想讨论下系统数据库,即information_schema。所以我们使用它
use information_schema;
让我们来看下表格。
show tables;
现在我们先来查看表的结构:
desc tables;
现在我们来使用这个查询:
select table_name from information_schema.tables where table_schema = "security";
使用这个查询,我们可以下载到表名。
Mysql有一个系统数据库information_schema,存储着所有的数据库的相关信息,一般的,我们利用该表可以进行一次完整的注入。以下为一般的流程。
猜数据库
select schema_name
from information_schema.schemata
猜某库的数据表
select table_name
from information_schema.tables where table_schema='xxxxx'
猜某表的所有列
Select column_name
from information_schema.columns where table_name='xxxxx'
获取某列的内容
Select *** from ****
上述知识参考用例:less1-less4
-----------------------------------------------------------------------------------------------------------------------------------
附录:
环境搭建:
1.从https://github.com/Audi-1/sqli-labs下载源代码。
2.将源代码复制到Apache webroot文件夹(htddocs,/var/www)。这里是用phpstudt搭建的环境,将其拷贝到D:\phpStudy\WWW目录下
3.打开sql-connections文件夹下的“db-creds.inc”文件
4.修改MySQL用户名和密码为你自己的。这里我本地mysql的数据库用户名和密码为root/root,因此将其db-ceds.inc的password改为root
5.打开浏览器,通过localhost的index.html访问文件夹。
6.点击setup/resetDB链接在你的mysql中创造数据库。
注:
如果有兴趣也可以通过视频进行学习,其下载地址为:
http://pan.baidu.com/s/1bo7PMaV
Sqli-labs之sql注入基础知识的更多相关文章
- sql注入基础知识
信息安全概论课堂作业 SQL注入之万能密码漏洞 第一道题是牵扯到了万能密码漏洞 用户名先输入个’ 返回了sql报错语句,猜测存在sql注入漏洞 使用万能密码测试 登陆成功 原理 假设登录框处的判断代码 ...
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- Sql Server 基础知识
Sql Server 基础知识: http://blog.csdn.net/t6786780/article/details/4525652 Sql Server 语句大全: http://www.c ...
- SQL数据库基础知识-巩固篇<一>
SQL数据库基础知识-巩固篇<一>... =============== 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用 ...
- Sql注入基础原理介绍
说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...
- 通过sqli-labs学习sql注入——基础挑战之less1-3
首先,先看一些基础知识吧!!!!本人只是初学者,记录一下自己的学习过程,有什么错误之处请指出,谢谢!大佬请绕过!!!! url编码:一般的url编码其实就是那个字符的ASCII值得十六进制,再在前面加 ...
- 通过sqli-labs学习sql注入——基础挑战之less1
环境准备: Phpstudy (PHP+Apache+Mysql) Sql-lab 首先了解下基础知识: URL编码: 因为在浏览器中,当我们访问一个网址的时候,浏览器会自动将用户输入的网址进行UR ...
- SQL 注入基础
SQL注入 SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为. 本质:把用户输入的数据当作代码执行.任何和数据库产生交互的地方便有可能存在注入. SQL ...
- 【SQL】- 基础知识梳理(二) - SQL简介
一.引言 在梳理这些知识之前,说实话,如果有人问我SQL是什么?我可能会回答就是“INSERT,DELETE,UPDATE,SELECT”语句呗,还能是啥. 二.SQL概念 SQL是什么? SQL是S ...
随机推荐
- SQL中NULL的妙用
商品表Products 库房表WarehouseDistrict 库存表WarehouseStock 一般写法 ;WITH stock AS ( SELECT DistrictId, ProductI ...
- scrapy-redis+selenium+webdriver 部署到linux上
背景:在使用selenium时,在本地使用windows,都会有一个图形界面,但是到了生产环境linux上没有了图形界面怎么部署呢? 解决方案: 1.安装图形化界面,不推荐,因为安装图形化界面会占用很 ...
- react native中props的使用
react native中props的使用 一.props的使用 1:父组件传递的方式 在子组件中可以用this.props访问到父组件传递的值 <View> <Text> { ...
- POJ 3784 Running Median(动态维护中位数)
Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...
- Scrum立会报告+燃尽图(Beta阶段第二周第六次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2414 项目地址:https://coding.net/u/wuyy694 ...
- vim 编码方式的设置
和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2.UTF-8 等流行的 Unicode 编码方式.然而不幸的是,和很多来自 Linux 世界的软件一样,这需要 ...
- struts-resultType属性
1.默认dispatcher:forward方式,服务器端跳转 2.redirect:客户端跳转 3.chain:Action转发,forward方式,服务器端跳转action 4.redirectA ...
- 寒假学习计划(C++)
课程 1,计算机程序设计(C++)-西安交通大学(中国大学mooc)课程链接 2,面向对象程序设计-C++-浙大-翁恺(网易云课堂)课程链接 理由 1西安交大的C++慕课从零基础教起,更注重基础,重点 ...
- Alpha事后诸葛会议
[设想和目标] Q1:我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? "小葵日记"是为了解决18-30岁年轻用户在记录生活时希望得到一美体验友好 ...
- Java多线程中的wait与notify
一.wait: 1. wait 是 object 类的方法, sleep 是 thread 类的方法. 2. 当前的正在我这个对象访问的线程 wait. 3. 当前的这个线程, 锁定在当前对象的这个线 ...