美文网首页
sqli-labs less23 过滤注释符

sqli-labs less23 过滤注释符

作者: Yix1a | 来源:发表于2019-05-15 16:48 被阅读0次
  • 转自不知名大佬的笔记

-----------------------------------less-23-----------------------------------

原url:

192.168.137.138/sqli-labs-master/Less-23

这节课将学到一些新东西:

preg_replace() 函数 和 数据库注释

    preg_replace()

PHP中用来执行正则表达式的匹配以及替换的函数。可以返回一个正则表达式转换后的值。

原型:

preg_replace(mixed pattern,mixedreplacement,string[, intlimit = -1[,int &count]] )pattern 要搜索的模式。可以使一个字符串或字符串数组或者正则表达式
replacement 用于替换的字符串或字符串数组。string 要进行搜索和替换的字符串或字符串数组。

作用: 在 string 中查找符合正则表达式 pattern 的部分 并将其替换为 replacement ; limit 可选参数 ,默认为 -1 表示无限次的替换 ; count 可选 ,表示完成的替换次数

例如:

<?php
string = 'April 15, 2003';pattern = '\b\w{5}\b'; #表示 有一个单词 是 5个 字母的,在string中,还有April满足 这个 查询条件
replacement = 'October'; echo preg_replace(pattern, replacement,string);
?>

输出:

October 15,2003

            数据库注释

数据库: 注释: 描述

SQL Server 、Oracle、PostareSQL --(双连字符) 用于单行注释

                /* */           用于多行注释

Mysq --(双连字符) 用于单行注释( 第二个横杠-后 面紧跟一个空格 或控制符,这也 是为什么前面注 入测试的时候 用+ 带替空格 的原因

                #           用于单行注释

                /* */           用于多行注释

在 less - 23 中呢,就要用到上面的知识

同样的,首先测试 ' " 之类的特殊字符,去破坏语法结构,看看会不会报错
(返回页面 出现 的 warning 和 注入没有多大关系,可以去关闭这个 warning显示)

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 ''1'' LIMIT 0,1' at line 1

这里报错了,看似很简单,和 less-1 一样

near ' '1'' LIMIT 0,1 ' at line 1

初步猜测 后台 sql 语句:

select username,password from table where id = 'input'

按照常识

用 1' and 1=1 # 和 1' and 1=2 # 去测试

放入sql语句中看看:

select username,password from table where id = '1' and 1=1 #'

这样 where 条件 是永真

这样返回页面应该为真

效果如下:

结果他还是报错了:

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 '' LIMIT 0,1' at line 1

-----------------现在直接去看看源码部分,这其中是怎么个情况--------------------

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");

// take the variables
if(isset(_GET['id'])) {id=$_GET['id'];

//filter the comments out so as to comments should not work
reg = "/#/"; //被替换的字符,匹配#号reg1 = "/--/"; //被替换的字符,匹配--双横杠
replace = ""; //替换成空字符id = preg_replace(reg,replace, id);//将ID值拿去校验,有没有非法注释符id = preg_replace(reg1,replace, id);//经过这两次过滤,单行注释符已经不存在了 //logging the connection parameters to a file for analysis.fp=fopen('result.txt','a');
fwrite(fp,'ID:'.id."\n");
fclose($fp);

// connectivity

sql="SELECT * FROM users WHERE id='id' LIMIT 0,1";//这里的ID按理说已经非常安全了,因为撤去了注释符,很多注入语句无法成功构成,所以,在之前构造好的语句,已经成功闭合了,而且没有语法错误的情况下,还是爆出语法错误,就是因为 注释符 丢失了,语句的语法并没有闭合
result=mysql_query(sql);
row = mysql_fetch_array(result);

if($row)
{
echo '<font color= "#0000ff">'; 
echo 'Your Login name:'. $row['username'];
echo "<br>";
echo 'Your Password:' .$row['password'];
echo "</font>";
}
else 
{
echo '<font color= "#FFFF00">';
print_r(mysql_error());//爆出 MYSQL 中的错误
echo "</font>";  
}

}
else { echo "Please input the ID as parameter with numeric value";}

?>


通过对源码的分析,已经知道了问题所在

就是因为 preg_replace() 的存在,这个是PHP 的自带的过滤函数

现在、、结合代码审计 来 构造注入语句

有两个思路:

    1-----不用注释符

    2-----用其他注释符替代

先想想 用其他注释符替代:

mysql一共有三种注释符:

--      #       /**/

很明显,第三种 /**/ 注释符,在源码中并没有对其处理

但是呢,/**/的用法和 C 语言中一样,注释的是其间的内容

比如:

/fffff/

这样达不到,SQL 注入的效果(在后续的学习中,知道了/**/可以代替空格)

所以只能想想第一种思路:

不用注释符

不用注释符的话,就应该去闭合他的SQL 语句,让其正常执行

比如,一个简单的语句:

1' or '1'='1

将其放入之前猜测的 SQL 语句中:

select username,password from table where id = '1' or '1'='1'

这样的话,没有使用注释符 也将 语句闭合了

其他语句类似,将其正确闭合就行了

不过目前2016/5/17我还不知道怎么用其他更复杂的语句去注入这种 注释符 被过滤的情况

在2016/5/19 我知道了怎么在构造的闭合条件中 添加更复杂的语句:

其实很简单,就在or或者 and 前面添加就行了

比如:

-1' union select 1,2,3,...or '1 //直接去猜字段,顺便爆出 字段位置
注:union select前面的条件应该为 假

放入 sql 语句中:

select username,password from table where id = '-1' union select 1,2,3... or '1'

语句说明,这样就起到了 or ‘1 代替注释符的效果

首先,注释符的主要作用,其实就是把 后面的 闭合条件 给注释掉

那么用 or '1 ,后面还有一个单引号,成功闭合了

而且 这个 or 后面的语句并没有进行 判读(比如1=1啊这类的),所以 这里用 and 和or
的结果是相同的

效果如下:
(先测试 union select 1,2,3,4 or ‘1)

报错了:

The used SELECT statements have a different number of columns

说明字段数应该小于4

改成
union select 1,2,3

效果如下:

返回页面 暴露出了 字段位置

构造语句:

1' and 1=2 union select 1,database(),3 or '1

效果如下:

在字段2的位置,爆出了 当前数据库名

        Your Login name:security
        Your Password:1

其他的注入语句就不一一实验了

总结:

通过 and 或是 or 构造闭合条件 代替 注释符

语句一般这样:

1(闭合条件) 注入语句 or (闭合条件)1

或者是这样:

1(闭合条件) 注入语句 and (闭合条件)1

但是在快速判断闭合条件时候

用的是 and

比如 是 GET 型传参

1'and'1

如果别和条件就是 ' 的话
那么

改变 第一个 值 1:

2'and'1

返回页面就会不同

反之,返回页面不变

相关文章

  • sqli-labs less23 过滤注释符

    转自不知名大佬的笔记 -----------------------------------less-23----...

  • sqli-labs level23 过滤注释符

    第二十三关 这关是GET注入方式,单引号闭合,但是找注入点的时候发现注释符被过滤了。 不能注释只能使用闭合,ord...

  • sqli-labs Less-26-28a

    Less-26看题目可知过滤了空格和注释符以及'or','and'。一般来说仅过滤了空格时可用php注释符//来替...

  • mysql注入

    注释符 # /**/ --+ -- - %00 union,select关键过滤:/!union//!select...

  • 走进RxJava源码(五) -- 过滤型操作符

    过滤型操作符 filter过滤符 take过滤操作符 Observable.interval(2, TimeUni...

  • C#基础第二天

    1、注释符 1.注销 2.解释 2、C#的3三种注释符 1单行注释符 // 2.多行注释符 /*内容*/ 3.文档...

  • lua基本语法

    1. 注释符单行注释:-- 多行注释:--[[注视内容 --]] 或者--[=[注释内容]=] 2. 标识符传统的...

  • Rxjava(三)之过滤操作符与条件操作符

    前言 上文我们介绍了创建操作符和变换操作符。这里我们接着介绍过滤操作符和条件操作符。 过滤型操作符 过滤型操作符顾...

  • Combine - Operator(操作符)(三)

    过滤 操作符|时间控制 操作符|(计算&减少 &数学 操作符) 过滤操作符 compactMap & tryCom...

  • Java语言基础

    注释与规范 代码注释单行注释//多行注释//文本注释/...*/ 变量与常量 标示符:1 标示符是为变量、函数、宏...

网友评论

      本文标题:sqli-labs less23 过滤注释符

      本文链接:https://www.haomeiwen.com/subject/wkfmaqtx.html