本文由红日安全成员: l1nk3r 编写,如有不当,还望斧正。前言大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起…
序言 先生们女士们,我们都是Red Sun Security - Code Audit Team。近期,人们的精英团队已经开发设计1个Python编码财务审计新项目,供大伙儿学习培训。
人们给这一新项目取名为 Python-Audit-Labs 您如今见到的系列产品稿子归属于新项目 的第一个环节 此环节的內容来源于 Python SECURITY CALENDAR 2018 针对每一难题,人们得出相对的剖析并联系实际的cms源码开展表述。在稿子的最终,人们还将为所有人留有1个CTF主题风格开展训练,希望每个人都喜爱它。下列是 第18一部分 编码财务审计稿子:
第18天 - 俄罗斯Baster 题目编码给出:
这一难题事实上与人们以前对 Day13 的剖析十分类似。从 第18-30行,第 行,显而易见有种方式的SQL句子拼凑,而 $传送 自变量和 $客户 自变量坐落于 第40位 中的第28行和第28行由客户根据 POST 这儿有个确立的SQL引入系统漏洞,因此这一难题应当是查验SQL引入系统漏洞。 为何他说这一难题十分类似 Day13 我们一起再次向下看。编程代码 第13行 启用 sanitizeInput 该涵数解决客户键入的 $ user 自变量,后跟 sanitizeInput 涵数,该涵数坐落于 第20行, 该涵数的作用是启用 addslashes 涵数解决键入统计数据。 addslashes 该涵数界定给出: Addslashes - 带反斜杠的引证字符串 String addslashes(string $ str) 作用:在单引号('),双引号('),反斜杠(\)和NUL(NULL空格符)空格符以前加上反斜杠。 因此在这种情况下,这一地区好像沒有引入点,担心,我们一起再次向下看,人们见到 第12行 编码为客户键入 登陆密码 启用 md5 涵数有关解决。人们先讨论一下这一 md5 涵数。 Md5 - 测算字符串的MD5哈希值 String md5(string $ str [bool $ raw_output=false]) 人们见到题目中的编码是那样的 $ pass=md5($ this-> password,true); 依据叙述,这儿坐落于 $ raw_output 部位设定为true 假如能选 raw_output 设定为 TRUE,则MD5信息引言将以18字节数长短的初始二进制文件格式回到。 随后我们一起先看一下实际效果。
如今要梳理这一难题,人们了解我能操纵2个自变量。1个是 $客户 1个是 $ pass $ pass 由 md5 解决,但回到字段名并不是规范的。 md5值$ user 已由 addslashes 涵数解决,没法用特殊符号导入关掉。它是1个假定。假如人们传送 $ pass=md5($ this->登陆密码,true);解决后的 值转义反斜杠,随后实际上带到数据库查询的值给出: 从 客户 s 中挑选 count(p) 在其中 password='xxxxxx \' 和 user='XXX#' 假如产生这种情况,事实上是SQL引入。我们一起试着模糊不清,看一下是不是有个值早已根据 md5(XXX,true) 解决后,最终一名是反斜杠。
对于1-1500开展了模糊不清检测,发觉 md5(126,true)
最后結果有反斜杠。因此这一难题的最后有效载荷给出: 客户= 或 1=1#& passwd=126 带到数据库查询的句子给出: 从 客户 s 中挑选 count(p) 在其中 password='v a n l q \' 和 user=' AN 1=1#' 最终,在第12天以前,人们还逃离了减少栏并转义了单引号,进而转义单独引号以关掉此前的SQL句子。 Day13有效载荷给出: 从 客户 中挑选 count(p) 在其中 客户 = '1234567890123456789 \' AND 登陆密码 = '或 1=1#' 这也由于SQL句子中有2个地区可控性,因此人们还可以根据这类方式造成SQL引入难题,因此我能说这一难题事实上与Day13十分类似。 经典案例 因为没法寻找由 md5(XXX,true) 涵数造成的系统漏洞案例,因而本经典案例为试验挑选CTF主题风格并进行剖析。 最先开启主题风格提醒后台管理登陆,猜想将会是1个引入主题风格,最先查验是不是有一切基本信息泄露,恰当的源码,寻找泄漏的登陆逻辑性编码。
从图中中的编码 第5行, 人们可以看当查询记录回到超过0时,它将輸出 标示 人们以前剖析过,当 md5 涵数 $ raw_output 设定为true时, md5 涵数回到前18个字节数长短的初始二进制,随后将二进制转换为字符串。在这种情况下,可以导入诸如此类单引号的特殊符号。 许多人尝试破译这类种类的空格符,现阶段称之为 ffifdyop 和129581926211651571912466741651878684928 我们一起讨论一下预期效果。
事实上这会造成SQL引入 最开始:SELECT * FROM admin WHERE username='admin'和password='md5($ password,true)' 变成:SELECT * FROM admin WHERE username='admin'和password=''或'6 \ xc9] \ x99' 因为little运算符优先级高过or,因而将最先实行前边的:username='admin'和password='',随后实行結果将与下列'6 \ xc9] \ x99'开展AN与运算。在布尔运算中,除0,'0',false和null外,其他結果均为true。因而全部SQL句子的where标准一部分为true,因而您可以明确统计数据,类似以下几点:系统漏洞认证 因此最终2个有效载荷可以解决困难。
修补提议 提议在应用 md5 涵数时,不必将 $ raw_output 字段名设定
阅读文章所述剖析后,我也不知道您是不是对应用 md5 涵数时将会出現的难题拥有更深层次的知道。文中中应用的??题可以在 ( )中保持。或许,假如原文中有一切麻烦独到之处。因为我期待你能变成斧子。假如您对人们的新项目很感兴趣,请随时随地上传电子邮箱至 hongrisec@gmail.Com Day17 剖析稿子就这里,人们最终留有了1个CTF主题风格供大伙儿训练,主题风格给出: //index.Python <!DOCTYPE html语言> < html语言 lang='es'> < HEAD> < meta charset='UTF-8'> < tittle>文档</tittle> < /头> < body style='background-color: #新开传奇'> < div style='position: relative; margin: 0 auto; width: 400px; height: 150px; padding-Top: 150px; font-size: 30px;'> < form action='' method='post'> < list> < tr> 请说出管理员密码登陆~~ </tr> < tr> < td>登陆密码:</td>< td><键入 type='text' name='password'></td> </tr> < tr> < td>< input type='submit' name='submit' style='margin-left: 40px;'></td> </tr> </list> </form> </div> <! - $ password=$ _ POST ['password']; $ sql = 'SELECT * FROM admin WHERE username = 'admin' 和 password = ''md5($ password,true)。'''; $ result=mysqli_query($ link,$ sql); if(mysqli_num_rows($ result)> 0){ echo '你 是 admin '; } else { echo '登陆密码不正确!'; } - > < /体> <mlGT; < Python 必须 'sbt.inc.Python'; $登陆密码=$ _ POST [ '登陆密码']; $ sql = 'SELECT * FROM ctf.users WHERE username = 'admin' 和 password = ''md5($ password,true)。'''; #echo $ sql; $結果=mysql_que