关于注释符引入

  • 如下题目(web171):

    1
    2
    3
    4
    //拼接sql语句查找指定ID用户
    $sql = "select username,password
    from user
    where username !='flag' and id = '".$_GET['id']."' limit 1;";
  • 这里$_GET['id']外的双引号是为了让PHP解析出传入的字符串,如果$_GET['id']值为1,则传入后源码为:

    1
    2
    3
    $sql = "select username,password 
    from user
    where username !='flag' and id = '1' limit 1;";
  • 基本payloads:
    -1' or username = 'flag',该payloads使得源代码中的username != 'flag' and id = '-1' or username = 'flag'
    这里由于and逻辑运算符的优先级大于or,所以传入payloads后的源码中的username != 'flag'该部分的源码无效,服务器只会解析or之后的语句,即对username = 'flag'进行解析。

  • 个人思路:

    • 由于源码后还有limit 1的语句,个人想要注释掉这一部分的代码,已经在phpstorm中测试过,在php语言中的SQL语句中使用sql的注释符,只会注释掉sql语句的符号,对php自身的符号不影响,如:image-20250415114151085 可见,php的外部引号没有受到sql中的注释符影响
    • 所以我们构建payloads:
      =flag' or username = 'flag' --
      且一定注意! sql注释符需要在结尾处多加一个空格才可以起效果