1.sql注入-----LOW-----源码分析

本文阅读 3 分钟
首页 代码,C/C#/C++ 正文

0x01上源码:

<?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
    // Get input
    $id = $_REQUEST[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

    mysqli_close($GLOBALS["___mysqli_ston"]);
}

?> 

分析重点:
  $query  = "      SELECT first_name, last_name FROM users WHERE user_id = '$id';        ";
拆除查询时候使用的语句:
  select   first_name,last_name   from   users   where  user_id='$id';

0x02 进行注入时候,分析真正在执行的语句:

注意:下面的语句,所有都忽略掉了鼠标点击后的,&sbumit=submit //能力有限

1.输入: ' ①真正传过去的语句是: select first_name,last_name from users where user_id=''' ②结果也是如此显示的,如下图所示有三个单引号: img 2.输入:1 and 1=1 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1 and 1=1’ ②如下图所示,为了达到效果,我输入了 1 and 1=1' ,可以看出若输入1 and 1=1,则真正传过去的是:‘1 and 1=1’

**③注意:本应该输入,1  and  1=1对吧。为什么我要输入1  and  1=1'呢,我是为了验证,系统会在输入的代码前后自动闭合,因为只有输错才会显示如图所示的内容。
④注意:红色框框外的,是高亮显示,只是起到了强调的意思,也就是根本没关系
⑤注意:如果我输入1  and  1=1呢,那么系统自动闭合后为:'1   and  1=1',这个正常输入,无可否认**

img 3.输入:1 and 1=2 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1 and 1=2’ ②如下图所示,为了达到效果,我输入了 1 and 1=2' ,可以看出若输入1 and 1=2,则真正传过去的是:‘1 and 1=2’

③**注意:如果我输入1  and  1=2呢,那么系统自动闭合后为:'1   and  1=2',问题来了,为什么1=2位恒假,还是这正常输入,正常回显呢?我理解为,在字符型注入中,若输入整型的结构,这个and逻辑判断语句就不起到作用了。**

img

4.输入:1' and '1'='1 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1’ and ‘1’=‘1’ ②如下图所示,红框框里的是自己输入的1’ and ‘1’='1,其实在传到后台服务时候会自动闭合,也就是 ‘1’ and ‘1’=‘1’

③有回显,有语句被执行的原因:
第一个表达式:select   first_name,last_name   from   users   where  user_id='1'
逻辑与符号:  and 
第二个表达式:  '1'='1'
因为1=1恒真,所以前面的语句被执行了

img 5.输入:1’ and ‘1’='2 ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1’ and ‘1’=‘2’ ②如下图所示,输出后,无任何的回显,那就说明没有任何的查询语句被执行。

**③没有回显,也就是没有语句被执行的原因:**
第一个表达式: select   first_name,last_name   from   users   where  user_id='1' 
逻辑与符号:  and
第二个表达式:'1'='2'
因为1=2恒假,所以前面的语句不执行!

img 6.输入: 1’ order by 2 # ①真正传过去的语句是: select first_name,last_name from users where user_id=‘1’ order by 2 #’ ②如下图所示,正常输入并正常回显,因为#把’给注释掉了。(#是注释符) ③分析: 第一条语句:select first_name,last_name from users where user_id=‘1’ 第二条:order by 2 最后是注释语句: # ’ img

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/102877589
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复