sqli-labs 提前准备篇

SQL注入

介绍

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

       原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。

       攻击

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

       防护

              归纳一下,主要有以下几点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

【SQL注入】SQLI-LABS的使用

Sqli-labs是一个非常好的SQL注入学习实战平台,涵盖了报错注入、盲注、Update注入、Insert注入、Heather注入、二阶注入、绕过WAF,比较全面的一个注入平台。本次在phpstudy环境上部署sqli-labs 注入平台。

       运行环境要求

  1. Apache+mysql+PHP
  2. Tomcat+mysql+java环境(部分关卡需要)

win平台下部署

Apache的环境在Windows下可以直接选择wamp、xampp、PHPstudy等进行安装配置,我选择的是xampp,这个集成环境比较轻量级,安装运行出错较少。

xampp下载地址:xampp

xampp的安装只需要保持默认设置,一直下一步就可以。安装后启动Apache和mysql服务,mysql默认用户为root,密码为空。

sqli-labs 提前准备篇_第1张图片        

sqli-labs的安装配置

将下载好的源码解压后放置到网站根目录,xampp为htdocs,wamp为/var/www

打开sql-connections/db-creds.inc文件(是下载的源码里面的文件)

修改inc里面的数据库用户名和密码,因为sqli-libs默认用户名为root,默认密码为空(修改为root),正好与xampp的配置相同,所以如果使用xampp在本地搭建,可以不用修改;

打开sqli-libs的主页,将sqli-labs-master里文件解压放在htdocs目录下,那么应该在浏览器里输入http://127.0.0.1将会打开主页

打开会有如下显示

sqli-labs 提前准备篇_第2张图片

点击Setup/reset Database for labs就可以初始化数据库或者重置数据库,成功后显示

sqli-labs 提前准备篇_第3张图片

 

注入相关知识补充

get型  注入方式与回显对比

sqli-labs 提前准备篇_第4张图片

post型

sqli-labs 提前准备篇_第5张图片

{{{注意:GET和POST差别在于,GET只需要提交参数id,而POST则需要username与password都正确}}}

 

不像GET中若出现错误回显必是Mysql语法错误(提交时使id存在),POST若不返回Mysql错误信息,光凭一个登录失败是分不清是用户名和密码不正确还是出现了Mysql语法错误。

所以我们就需要在POST时构造永真条件使返回忽略用户名和密码不正确这种情况。若将查询语句闭合则会显示登陆成功,则可以依次增加小括号个数分析查询语句:

     uname=1&passwd=1 or 1=1--+

     uname=1&passwd=1' or 1=1--+

     uname=1&passwd=1" or 1=1--+

     uname=1&passwd=1') or 1=1--+

     uname=1&passwd=1") or 1=1--+

 

补充知识

    MySQL的注释语句

        #  注释从#开始到行尾   在浏览器中直接输入#是无效的编码,可以用%23代替

        - -空格  注释到行尾  --后必须跟空格

        /**/   注释/*到*/里的内容

 

        查询用户数据库名称语句

           select schema_name from information_schema.schema limit 0,1

        查询当前数据库表语句

            select table_name from information_schema.tables where table_schema=(select database ()) limit 0,1

        查询指定表的所有字段

            select column_name from information_schema.columns where table_name=’**’limit 0,1

        联合查询

            select id, username, password from users union select 1,2,3

        将多行结果拼成一行 group_concat

            select group_concat(user) from table limit 0,1

        (用group_concat可以把多个结果拼成一行,这样即使只有一个显示位也可以显示所有信息)

        将多个字段拼成一个字段 concat

            select concat(username, passwd) from table

 

你可能感兴趣的:(sqli-labs)