之前在学校的时候参加了ctf比赛,有幸拿了一个代码审计题的一血,但是当时可能也是算运气比较好吧,因为我的思路并不是常规解法,但还是拿了一血,现在更深入的学习php和sql注入之后,反过来看这道代码审计题,又有一种豁然开朗的感觉。

虽然一度到了第二名,但是最后还是没有稳住,不过在我们队伍前面的都是大三的学长,这也不算特别难受吧。

这个题目是个源码泄露的题,用WWW.zip就能够将他的代码下载到本地,如下:

拿到之后以当时的技术水平肯定是审计不出来的,所以直接上了sexy代码审计系统审计:

审计结果如图,首先我排除了3,因为xss漏洞必须要有道管理员点击之后才会生效,所以直接放弃,那么突破这道题目的关键就放到前面两个点上,找到核心的functions.php代码如下:

<?php
error_reporting(0);
session_start();
include("config_ini.php");function escape1($string){$a = 1;$b = 2;global $link;$string = $link->real_escape_string($string);return $string;
}function check($seesee){$seesee = trim(escape1($seesee));if(strlen($seesee)<5){die("你谁啊你,你就想登录");}if(strlen($seesee)>11){$seesee = substr($seesee, 0, 11);}return $seesee;
}function Drawtarget($file,$path){$zipfile = new ZipArchive;if ($zipfile->open($file) === TRUE) { //解压zip文件$zipfile->extractTo($path);$zipfile->close();
}
}
function SeeseeDir($path) {$papers = scandir($path);foreach ($papers as $document) {14$address = "$path/$document";if (is_file($address)) {$section = pathinfo($document);$tailoring = strtolower($section['extension']);//获取扩展名判断是否删除$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","pHp","pHp5","pHp4","pHp3","pHp2","Html","Htm","pHtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","jSp","jSpx","jSpa","jSw","jSv","jSpf","jHtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","aSp","aSpx","aSa","aSax","aScx","aShx","aSmx","cEr","sWf","swf","htaccess","ini");if (!in_array($tailoring, $deny_ext)) {@chmod($address, 0666);} else {@chmod($address, 0666);    // 防止连接意外掉线unlink($address);}} elseif ($document != '.' && $document != '..' && is_dir($address)) {CheckDir($address);}}
}function check_lg(){if($_SESSION['logged']!=1){die("请先登录");}
}
function check_ad(){if($_SESSION['admin']!="True"){die("啊,只有管理员才可以哦!");}
}
function send_to_phone($randomssss){$phone_number="1111111111";//发送随机的验证码到管理员的手机
}
?>

管理员后台login.php的代码如下:

<?phpinclude("config_ini.php");
include("functions_ini.php");session_start();$user = $_POST['username'];
$pass = $_POST['password'];$user = check($user);
$pass = check($pass);   //这里不行~$sql = "SELECT username, password FROM ctf2020 WHERE username='" .$user ."' && password='" .$pass ."'";
$res = $link->query($sql);if ($res->num_rows > 0 or $_SESSION['logged']==1){$_SESSION['logged'] = 1;
header("Location: admin.php");
}
else{echo "小老弟,就这还谈恋爱?"."<br>";
}$link->close();?>

这段代码在当时的我看来是一头雾水,一开始用bp去爆破管理员登录后台无果

然后我的直觉就是sql注入进管理员后台,于是跟着saxy审计出来的php去找sql漏洞,remote_admin.php代码如下:

<?phpinclude "functions_ini.php";
session_start();check_lg();
error_reporting(0);
# 管理员想远程访问后台时使用
$remote_check_admin = create_function("",'if(isset($_SERVER["HTTP_CHECK_ADMIN"])){$_SERVER["REMOTE_ADDR"] = $_SERVER["HTTP_CHECK_ADMIN"];}');mt_srand(time());
$rdm = mt_rand();
$rdmrd = $rdm.time();eval("function admin_$rdmrd() {"."global \$remote_check_admin; \$remote_check_admin();"."}");send_to_phone($rdmrd); //生成随机动态的验证码发给管理员$_GET['rdmrd']();
if($_SERVER['REMOTE_ADDR']=="127.0.0.1"){$_SESSION['admin'] = "True";echo "欢迎您admin,即将为您跳转到后台";sleep(3);echo "<script> alert('欢迎您admin,即将为您跳转到后台');parent.location.href='./admin.php'; </script>";
}
?>

找到eval("function admin_$rdmrd()这个地方对应上去找到的是create_function()这样一个匿名函数

然后百度大法发现这个地方果真有所谓的后门漏洞:

但是很遗憾,这个地方即使有匿名函数这个漏洞,但是还是不能够通过这个地方实行sql注入,原因就在functions_ini.php的这个地方:

这个地方他使用了一个real_escape_string()的匿名函数,这个匿名函数可不得了,这个函数一出,可以说几乎断绝了sql注入的一切可能,他的功能简单一点说就是在所有的可注入符号后面加一个转义符(\),也就是如果你用id=1’进行注入,他会自动在id=1’后加一个转义符,即变成id=1‘\,也就是说’会被转义掉,就不能进行sql注入。

这个地方在经过了这么久的学习之后,如果这个地方是采用的gbk编码,那么宽字节注入应该也是行得通的。这个地方其实当时是卡了很久的,甚至一度放弃了sql注入的想法,但是在后面仔细对代码一个函数一个函数的查功能之后,终于发现了一个让我兴奋的点,
real_escape_string()和substr()这两个函数一起使用,那么就存在了一个问题:

substr() 函数返回字符串的一部分
如:echo substr(“Hello world”,10),返回的值是d
echo substr(“Hello world”,2),返回的值就是llo world

那么再看一下这段代码:

这里用substr()截取seesee这个变量,因为如果在字符串的后面加上任意一个符号,real_escape_string()都是会将它加上一个转义符的,但是这里substr($seesee,0,11)只截取0-11取11位,那么如果我构造一个 “aaaaaaaaaa\” 这个字符串,通过real_escape_string()这个函数转义之后就会变成12位: “aaaaaaaaaa\\” ,但是substr()这个函数只取11位,那么 \ 就会跟着传进sql语句中执行,达到绕过real_escape_string()的效果,构造密码为"or+2>1#",这时候的sql语句就应该为:

SELECT username, password FROM ctf2020 WHERE username='aaaaaaaaaa\' && password='or+2>1#'

进到登录页面输入帐号和密码


ok第一关已经被攻破,进入了他的后台

进入了后台,但是这个地方显示要管理员才能够继续操作,一开始想的是利用bp构造一个127.0.0.1的本地xff,然而无果,又只有审计代码,还是回到了最先找到漏洞的那个地方

这个地方因为create_function()这个函数的漏洞,能够构造一个匿名函数来伪造REMOTE_ADDR

科普一下REMOTE_ADDR:REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP

碰巧看到一个相似的ctf题目如下:

构造一个\x00lambda的匿名函数通过bp爆破进入管理员后台

bp抓包lambda函数的变量,因为是本地管理员登录,加上一个check-admin:127.0.0.1

这里我写了一个1-1000的字典对其进行爆破,只要返回值为200即响应成功

关掉bp的抓包刷新页面后如图所示:

这个地方第二关也已经绕过了,进入了他管理员的界面,接下来就是文件上传了,但是这个文件上传很贼,先看一下代码:

function SeeseeDir($path) {$papers = scandir($path);foreach ($papers as $document) {14$address = "$path/$document";if (is_file($address)) {$section = pathinfo($document);$tailoring = strtolower($section['extension']);//获取扩展名判断是否删除$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","pHp","pHp5","pHp4","pHp3","pHp2","Html","Htm","pHtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","jSp","jSpx","jSpa","jSw","jSv","jSpf","jHtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","aSp","aSpx","aSa","aSax","aScx","aShx","aSmx","cEr","sWf","swf","htaccess","ini");if (!in_array($tailoring, $deny_ext)) {@chmod($address, 0666);} else {@chmod($address, 0666);    // 防止连接意外掉线unlink($address);}} elseif ($document != '.' && $document != '..' && is_dir($address)) {CheckDir($address);}}

重点看一下$deny_ext这一行,这一行代码就是限制上传的文件类型,可以说其实已经做得很完美了,无论是大小写的文件都已经被过滤掉了,不过出题人还是忘过滤了一个文件类型,就是php7(php是世界上最好的语言,QAQ)

那么直接构造一个php7的一句话木马,压缩成zip

试着上传一下,果然没有出错,返回了文件上传的路径

直接访问这个路径,然后hackbar post传参,直接拿到flag

当时有几个地方其实是靠学长的提示才能够继续往下进行,但是总体来说的思路还是没有错的,经过一段时间的学习之后,现在回过头来看这些php代码又有了一种豁然开朗的感觉

记一次php、sql注入学习后的一道ctf代码审计题复盘相关推荐

  1. SQL注入学习part07:(SQL注入语句总结)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part07 整数型和字符型 整数型 字符型 ...

  2. SQL注入学习part05:(结合sqli-libs学习:41-50关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part05 第四十一关 第四十二关 第四十三 ...

  3. SQL注入学习part04:(结合sqli-libs学习:31-40关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part04 第三十一关 隐藏关卡 第三十二关 ...

  4. SQL注入学习part03:(结合sqli-libs学习:21-30关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part03 第二十一关 第二十二关 第二十三 ...

  5. SQL注入学习part02:(结合sqli-libs学习:11-20关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part02 第十一关 第十二关 第十三关 第 ...

  6. SQL注入学习part01:(结合sqli-libs学习:1-10关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part01 第一关 第二关 第三关 第四关 ...

  7. 探针一号的SQL注入学习笔记

    SQL注入学习笔记 文章目录 SQL注入学习笔记 1.问题 2.sqlilabs环境配置 3.第一个注入过程详解(整型注入) 4.跨库注入 5.字符型注入 5.报错注入 6.POST和COOKIE请求 ...

  8. SQL注入学习详细过程

    sql注入学习笔记 一.union注入 1.判断是否存在注入: 2.查询字段数量 3.查询SQL语句插入位置 4.获取数据库库名 5.获取表名 6.获取字段名 7.获取数据 union注入PHP代码 ...

  9. SQL注入学习part06:(结合sqli-libs学习:51-61关)

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) SQL注入学习part06 第五十一关 第五十二关 第五十三 ...

最新文章

  1. iBATIS第一部分基础
  2. 服务器通过光纤模块挂载存储服务器
  3. php 字符串拼接效率,php中3种字符串连接的效率比较实例详解
  4. Hadoop二次开发项目案例方案汇总
  5. my.ini修改后服务无法启动_Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署
  6. webserver之日志系统
  7. Docker教程小白实操入门(21)--如何备份、恢复数据卷
  8. python程序设计基础智慧树_智慧树知到《Python程序设计基础》章节测试答案
  9. matlab不用hist画直方图,matlab可以画直方图
  10. 总结测试工程师面试题(含答案)
  11. Linux安全模块(LSM)学习——简单的LSM demo(1)
  12. C# + OpenXML 生成 Word 文档(VS2015)
  13. deepin linux 安装jdk,deepin安装JDK
  14. BUUCTF之文件中的秘密
  15. DSPE-PEG-LTLRWVGLMS(二硬脂酰基磷脂酰乙醇胺-聚乙二醇-肿瘤靶向蛋白);神经胶质瘤归巢肽
  16. j计算机屏幕关闭时间,win7如何设置自动关闭电脑屏幕的时间?
  17. 5元的小乌龟吃什么_小乌龟吃什么?小乌龟怎么养经验详解
  18. 十五数码难题 A*算法及深度优先算法实现
  19. mysql查询IN索引无效的问题【已解决】
  20. 系统中的obj文件、dll文件、so文件、lib文件、exe文件、vcproj文件、sln文件

热门文章

  1. 上来微软这条贼船有阵年头了
  2. 利用python实现星座运势查询APP
  3. 培训计算机心得体会800字,职业技能培训心得体会800字(精选5篇)
  4. C语言的C89、C99和C11标准(上)
  5. 基于PHP MYSQL的化妆品店会员管理网站的设计与实现毕业设计源码131102
  6. 运维工程师技术面试指导
  7. AES加密:PHP与Java互通问题
  8. NeuralProphet之三:回归(Regressors)
  9. Linux服务介绍一,关闭你不需要的服务
  10. iOS 语音读文字so easy