Table Of Contenti春秋-夏刊-代码审计(第二期)
目录
前前前言言言
代码审计| FineCMS 漏洞挖掘········ 47
正所谓“磨刀不误砍柴工”,要先学前面基础,到进阶部分才不
(finecms配置文件写入问题,不过有限制,有些程序倒没有限制,
会一头雾水。进阶实战篇是由浅入深,循序渐进的文章组成。还
那就不用担心什么条件不条件的了。)
有就是要有耐心,俗话说:万丈高楼平地起。对待代码审计,要
克服急躁情绪,不厌其烦。代码审计不但能为你积蓄技能,同时
【代码审计初探】beescms v4.0_R SQL····50
也磨炼了你的心性。让自己学有所思、学有所乐、学有所得,帮
助自己克服对代码审计的恐慌。希望大家学习完这个专题能从看
【代码审计】对Beescms SQL注入漏洞的进一步思考
到代码就躁过渡到一天不审就手痒境界!
····················· 53
代码审计 |Z-BlogPHP_1_5_1_Zero GetShell漏洞分
代码审计之绕过addslashes总结············ 1
(难道用了addslashes函数去过滤就完全可以避免注入了吗?) 析·····················56
常见WEB漏洞原理分析及利用方式——SQL注入篇 ····7 代码审计| ZZCMS 8.2 任意文件删除导致GetShel·
(SQL还没入门的赶紧的,过了这个村就没这个店了!) ······················61
(任意文件删除导致getshell,这个姿势在很多程序写入配置文件
代码审计&细谈变量覆盖漏洞············ · 9 的时候都会存在过滤不当的情况。)
(找到变量覆盖漏洞去怼开发:做什么开发啊,你女朋友被掉包了都不知道!)
代码审计 |OTCMS 3.20漏洞组合利用可前台GetShell
常见WEB漏洞代码层原理分析及利用方式之Php代码执行篇· ······················65
························· 20 代码审计| PHPSHE 1.5漏洞集合······ · 71
(代码审计最喜欢最是找代码执行漏洞了,能执行代码了差不多离shell就不远
了。)
相关阅读
相关阅读
常进见W阶EB实漏洞战代码层原理分析及利用方式——文件操作漏洞
篇························ 24
(文件包含、文件读取、文件删除、文件修改以及文件上传这些都是代码审计必
三款自动化代码审计工具
须了解的不能包含我就删,不能删除我就改,不能修改我就上个马儿弄shi你。)
一个CMS案例实战讲解PHP代码审计入门
代码审计| 适合练手的ZZCMS8.2漏洞········· 29
(这套程序确实漏洞百出,很适合新手去练手,让成就感支持自己坚
一名代码审计新手的实战经历与感悟
持学下去!)
代码审计入门总结
代码审计之织梦最新版后台代码注入········· 33
(准备好了吗?SQL实战分析来了,CVE-2018-7700漏洞的分析)
代码审计之dedecms最新后台两处getshell······ 39
(dedecms最新的getshell,还在烦恼弄到了后台拿不了shell?)
Thinkphp框架 3.2.x sql注入漏洞分析·········42
(先偷偷告诉大家一个赚钱的机会,现在有很多XX游戏都是用这个版本来开发
的,发家致富的机会来了!)
11 1
1
i春秋-夏刊-代码审计(第二期)
代码审计之绕过addslashes总结
作者:无敌情痴
一:addslashes防御sql注入原理
上面是一段登录代码以及一个登录表单,正常情况下要输入正确的账号密码才可以登录
不过由于username是可控的,并且没有经过任何过滤,所以可以利用这个来绕过密码检测,密码随便输入,账号输入admin'#懂sql的朋友
应该知道是什么情况了,这样执行的语句就是select count(*) as num from admin where name=admin 了,这样就绕过了密码检测了.
下面使用addslashes来防御(addslashes函数会把' " %00 \ 这些字符前面加上一个\来转义他们)
把上面的代码改改
1
1
i春秋-夏刊-代码审计(第二期)
然后我们再试试
发现已经登录不了了
我们查看一下数据库执行的语句
11 Init DB test
11 Query select count(*) as num from admin where name='admin\'#' and pass='d58e3582afa99
040e27b92b13c8f2280'
11 Quit
'admin\'
可以看到'被转义\'这样就逃不出引号了
二:字符编码问题导致绕过
2.1:设置数据库字符为gbk导致宽字节注入
这样却登录成功了,这是因为宽字节问题,这是因为 %df和\(%5c)合成了一个運 导致后面'没有被转义,闭合成功,逃出引号,成
功注入这里借P牛的一段话(这就是mysql的特性,因为gbk是多字节编码,他认为两个字节代表一个汉字,所以%df和后面的\也就
是%5c变成了一个汉字“運”,而’逃逸了出来。)
2.2:使用icon,mb_convert_encoding转换字符编码函数导致宽字节注入
在使用iconv和mb_convert_encoding进行字符编码转换的时候同样会造成宽字节注入,我们先试试utf-8转gbk,转码函数不管是
iconv或者mb_convert_encoding都会造成宽字节注入。
2
1
i春秋-夏刊-代码审计(第二期)
http://127.0.0.1/ichunqiu/login1.php?username=admin%df%27or%201=1%23&password=test 访问测试,登录成功,可以注入
同样是因为因为 %df和\(%5c)合成了一个運 导致后面'没有被转义,闭合成功,逃出引号,成功注入再试试 gbk 转 utf-8
http://127.0.0.1/ichunqiu/login1.php?username=admin錦%27or%201=1%23&password=test
访问测试,发现成功了,借一下P牛对这个的解释:(錦”这个字,它的utf-8编码是0xe98ca6,它的gbk编码是0xe55c。当我们的錦
被iconv从utf-8转换成gbk后,变成了%e5%5c,而后面的’被 addslashes 变成了 %5c%27,这样组合起来就是 %e5%5c%5c%27,两个
%5c就是\\,正好把反斜杠转义了,导致’逃逸出单引号,产生注入。)
三:编码解码导致的绕过
下面几种情况差不多,都是因为字符串在带入查询前,被做了一些编码解码操作没有再做一次过滤,导致绕过了addslashes的过滤
(其实可以绕过各种防注入,不仅仅是addslashes),这种案例我在审代码的过程中还是遇过一些的。
3.1、url解码导致绕过addslashes
http://127.0.0.1/ichunqiu/login1.php?username=%2561%2564%256d%2569%256e%2527%2520%2523&password=test
访问后发现登录成功了
3
1
i春秋-夏刊-代码审计(第二期)
%2561%2564%256d%2569%256e%2527%2520%2523
是做了两次编码的admin' #,之所以要做两次编码是因为web服务器会自动对从$_GET过来的数据解码一次,要编码两次
$username=addslashes($username);
$username=urldecode($username);
虽然在做了addslashes来转义引号,但是下面一行代码用了urldecode来对$username做解码,所以可以利用url编码来绕过过滤
看看数据库执行记录,确实被解码了
3.2、base64解码导致绕过addslashes,和url解码绕过差不多是一回事
$username=addslashes($username);
$username=base64_decode($username);
也是因为解码后没有在过滤,导致base64编码绕过:http://127.0.0.1/ichunqiu/login1.php?username=YWRtaW4nICM=&password=test
登录成功,看看数据库执行记录,确实被解码了
3.3:json编码导致绕过addslashes
json编码绕过addslashes是因为json编码会把\转换为\\ ,admin' # 被addslashes会变成admin\' # 引号被过滤了转移不了,但是
经过了json_encode后变成admin\\' # 引号成功逃了出来,可以注入
4
1
11
i春秋-夏刊-代码审计(第二期)
http://127.0.0.1/ichunqiu/login1.php?username=admin%27%20or%201=1%20%23&password=test,访问后发现登录成功
查看数据库执行记录可以看到\被转换为\\
四:一些特殊情况导致的绕过
4.1、没有使用引号保护字符串,直接无视addslashes,这种情况的案例不少,虽然做了addslashes但是没有引号保护导致直接注入
4.2、使用了stripslashes
这种案例我只在乌云看过一次,程序明明在开头对所有变量做了$_GET,$_POST,$_COOKIE 偏偏出来了一个牛逼哄哄的程序员,在数据带入
查询之前做了stripslashes,去掉了转义,直接注入
4.3、字符替换导致的绕过addslashes
这种情况也看过一些案例,程序在带入程序之前把字符串的某些字符做了替换,而替换的字符中出现了一些\ ' 导致了注入的绕过,比如
下面这样
5
1
i春秋-夏刊-代码审计(第二期)
http://127.0.0.1/ichunqiu/login1.php?username=admin%27%20%23&password=test
访问,发现登录成功,这里之所以可以绕过addslashes是因为前面做了$username=str_replace(array("\\","/"," "),array("","","")
,$username); 把addslashes后的\' 变成了',闭合成功,逃出引号注入
结语
上面的内容基本是我见过的遇过的所有绕过addslashes的方式了,当然肯定不止这些,要看具体的代码,各种各样的操作可能会导致各
种姿势的绕过过滤,本人是个菜逼学艺不精,文章难免有不足之处,希望大家多多指正。最后也谢谢泉哥的点评,泉哥辛苦了。(PS:
猜猜我这文章格式是抄袭I春秋的那个大牛的)
点点此此返返回回目目录录
6
1
i春秋-夏刊-代码审计(第二期)
常见WEB漏洞原理分析及利用方式——SQL注入篇
作者:SaFeBuG
1.SQL注入
1.1 普通注入
普通注入分为int型和string型,在string型注入中需要使用单或双引号闭合。
1.1.1 整型注入
测试代码:
测试代码中GET id参数中存在SQL注入漏洞(整型注入),测试如下
原本的SQL注入语句已通过查询出错的方式结合union联合查询到了当前数据库的相关信息。需要注意的是查询出错和语法出错是两
回事,加单引号和双引号是用来闭合语句重新构造的,像这个例子如果是通过加引号的方式,那样得到的报错是语法错误,数据库
根本不会解析执行,同样后半句的联合查询也不会执行。在此一定要把sql注入的原理理解清楚。
数据库操作存在一些关键字,php代码审计的时候可以通过查找这些关键字来定向挖掘SQL注入漏洞:
select from、mysql_connect、mysql_query、mysql_fetch_row等。
1.2 编码注入
编码处理的函数也是存在问题的,通过输入转码函数不兼容的特殊字符,可以导致输出的字符变成有害数据。SQL注入里最常见的
编码注入是MYSQL宽字节以及urldecode/rawurldecode函数导致的。
1.2.1 宽字节注入
当设置“set character_set_client=gbk”时会导致一个编码转换的注入问题,这就是宽字节注入:注入参数里带入%df%27,即可
把程序中过滤出的\(%5c)吃掉。
假设
里面的id参数存在宽字节注入漏洞,当按照普通字符型注入提交时,MYSQL实际运行的SQL语句是
这是由于单引号被自动转义成\'后,前面的%df和转义字符\反斜杠(%5c)组合成了%df%5c,也就是“運”字,这时候后面的单引号
还在,成功闭合了前面的单引号。出现这个漏洞的原因是在PHP连接MySQL的时候执行了“set character_set_client=gbk”的设置
告诉MySQL服务器:客户端来源数据编码是GBK,然后MySQL服务器对查询语句进行GBK转码导致反斜杠\被%df吃掉,而一般都不直接
这么设置。通常的设置方法是 SET NAMES 'gbk' ,等同于如下代码:
这同样也是存在漏洞的,官方建议使用mysql_set_charset方式来设置编码,然而它也只是调用了SET NAMES,所以效果也是一样的。
不过mysql_set_charset调用SET NAMES之后还记录了当前的编码,留着给后面mysql_real_escape_string处理字符串时使用,所以
在后面使用mysql_real_escape_string()函数来参数过滤可以解决这个漏洞。
7
1 1
i春秋-夏刊-代码审计(第二期)
测试代码:
因为编码问题所以存在汉字显示乱码的问题,但是可以看到SQL语句是正常执行了的,注入成功。对宽字符注入的挖掘只需搜索如下
几个关键字即可:SET NAMES、character_set_client=gbk、mysql_set_charset('gbk')
1.2.2 二次urldecode注入
现在的web程序大多都会进行参数过滤,通常使用addslashes()、mysql_real_escape_string()、mysql_escape_string()函数或者
开启GPC的方式来防止注入,也就是给单引号(')、(")、反斜杠(\)和NULL加上反斜杠转义。如果某次使用了urldecode或者
rawurldecode函数,则会导致二次解码生成单引号而引发注入。原理是当提交参数到WebSever时,WebSever会自动解码一次,假设
目标开启了GPC,提交
因为提交的参数里没有单引号,所以第一次解码后的结果是id=1%27,%25的解码结果是%,如果程序里使用了urldecode或者
rawurldecode函数来解码id参数,则解码后的结果是id=1',单引号成功拼接近字符串,可能引发注入。
这种注入漏洞主要是由于urldecode使用不当导致的,因此可以通过搜索urldecode和rawurldecode函数来挖掘二次urldecode注入
漏洞。
注:
此笔记为代码审计一书的学习笔记,将我认为必须要了解和掌握的原理性的知识记录下来便于复习和巩固。同时本书中出现的错误
着实不少,不论是文字叙述还是代码段都有,因此我建议大家去自己手动把这些例子都挨着敲一遍,根据报错就可以发现同时也加
深对这些漏洞出现的原理的理解。这样以后自己做代码审计的时候举一反三,自己独立挖掘分析,而不是照葫芦画瓢。
点此返回目录
8
1