zoukankan      html  css  js  c++  java
  • 《网络攻防实践》第六周作业

    New Document

    第六周实验:

    第一部分:SQL注入攻击

    一、实验坏境及配置 #:

    SEED Ubuntu 镜像(Firefox、 apache、 phpBB2):

    二、实验步骤

    1. 运行命令 sudo service apache2 start,启动apache2

    2.通过 http://www.sqllabmysqlphpbb.com 访问phpBB2 web

    3.关闭对抗注入措施 magic quote是自动对抗 SQL 注入的机制,输入命令sudo gedit /etc/php5/apache2/php.ini,将magicquotesgpc = On修改为magicquotesgpc = Off。 sudo service apache2 restart命令重启 Apache。

    三、实验任务

    ① 对 SELECT 语句的攻击

    攻击原理介绍:

    首先访问虚拟机内的URL:www.sqllabmysqlphpbb.com。在进入 phpBB之前系统会要求你登陆。这个登陆认证由服务器上的 login.php 实现,需要用户输入用户名和密码来通过认证。用户键入用户名和密码后,login.php 会将它们与 mysql 数据库中的 username 和user_password 字段进行比较,如果匹配就登陆主界面。和其他大多数 web 应用程序一样, PHP程序使用 SQL 语言与背后的数据库交互。在 phpBB2 中,下面的语句实现了对用户的认证。
    
    SELECTuser_id,username,user_password,user_active,user_level,
    user_login_tries,user_last_login_try
    FROMUSERS_TABLE
    WHEREusername=‟$username‟ANDuser_password=‟md5($password)‟;
    if(foundonerecord)
    then{allowtheusertologin}
    

    所以对于存在SQL漏洞的网站来说,我们只要构造特殊的“字符串”使得SQL语句为真,就能够成功登录。 如在用户名输入框中输入' or 1=1#,密码随便输入,此时合成的SQL查询语句为:select * from users where username='' or 1=1#' and password=md5('')。该语句在SQL中始终为真,不再去验证密码。

    “#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,不会去执行。即select * from users where username='' or 1=1#' and password=md5('')等价于select * from users where username='' or 1=1,因为1=1永远成立的,即where子句总是为真,该sql语句进一步简化之后,等价于select * from users。由于该页面不让输入“=”,所以我们只能输入alice'#(不能输入‘#,前面必须跟一个数据库有的用户名,所以这需要慢慢挖~),就可以在不知道alice密码的情况下登录了。

    ② 对 UPDATE 语句的攻击

    攻击原理:

    当用户想要在 phpBB2 中修改他们的资料时,可以点击 Profile,然后填写表单修改。用户发送修改请求后,会执行include/usercp_register.php中的一条 UPDATE SQL 语句。在这条语句中同样有一个 SQL 注入漏洞。
    

    以 alice 登陆,目标是修改ted 的资料信息,包括他的密码。攻击成功后将可以登陆 Ted 的账号。

    点击Memberlist查看ted的信息,可以看到一个带参数的脚本,猜测ted的id为6。

    我们再在interests栏中输入123'where user_id=6#,即将update语句中interests后的语句全部注释掉,并将where条件设置成ted的id。

    再次点击Memberlist查看ted的信息,可以看到ted的interests改为123。

    Current password里输入alice密码(alice),New password里输入1,即可将ted的密码修改为1了。

    最后,我们输入用户名ted,密码1,即可登陆,大家试试吧!

    ③ 对抗 SQL 注入

    攻击原理:

    SQL 注入漏洞的根本原因是没有将代码和数据区分开。当组建一个 SQL 语句时,程序(如 PHP 程序)知道哪个部分是代码哪个部分是数据。不幸的是当 SQL 语句送往数据库执行时,这个边界被打破,当程序被注入时, SQL 解释器看到的边界可能和最初的边界不一样。为了解决这个问题,保持服务端程序和数据库看到的边界一样就十分重要。
    

    攻击手段: (1)使用 magicquotesgpc 避开特殊字符。我们只需要在单引号前加一个反斜杠()PHP 提供了自动在单引号、双引号、反斜杠和空字符前添加反斜杠的机制,如果这个 选项启用,那么所有这些从用户输入的特殊字符会被加反斜杠。启用方法为,修改/etc/php5/apache2/php.ini的 magicquotesgpc = On,然后重启 Apache。

    (2)使用 addslashes()来避开特殊字符。

    (3)使用 mysqlrealescapestring 避开特殊字符。一个较好的方法来防止 SQL 注入攻击是使用数据库的回避机制。 MySQL 提供了一个机制,叫 mysqlrealescapestring(),它在一些特殊字符前加反斜杠,包括: x00, , , , ‟, “, 和 x1A。

    (4)Prepare Statement

    MarkdownPad Document