今天笔者和大家分享的是一道来自2017年全国大学生信息安全竞赛有关SQL注入的题目,题目地址http://120.132.56.20:1515 有兴趣的小伙伴可以自己尝试做一下。
本题知识点1:sql注入 2.svn源码泄露
审题,发现题目有如下几个页面
查看源码似乎也没有得到有效的线索,于是使用burp抓包查看有交互的地方,在your name 界面返回了sql语句,判断这道题目与sql注入有关
尝试单引号注入,可以发现单引号被过滤成了\
通过测试我们也可以发现,name允许的长度为11,否则会弹出警告name too long笔者做到这里有点卡住了没有了思路,后来发现这道题也涉及到了另外一个知识点,.svn源码泄露,恢复源码。接下来我们对其进行审计
首先在index.php中我们看到了这样一段代码
大致意思是调用了session函数,如果帽子的颜色是绿色则会显示绿色帽子的图片,如果是黑色则会显示flag,那么我们去找一下在哪里这个session函数还出现过,在login.php文件中我们看到了这个session函数,对如下一段代码进行审计
if (isset($_POST["name"])){ $name = str_replace("'", "", trim(waf($_POST["name"])));
在这段代码中使用了trim函数以及str_replace函数,来看一下他们的语法
trim
定义和用法
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
相关函数:
ltrim() - 移除字符串左侧的空白字符或其他预定义字符
rtrim() - 移除字符串右侧的空白字符或其他预定义字符
语法
trim(string,charlist)
参数 | 描述 |
---|---|
string | 必需,规定要检查的字符串 |
charlist | 可选。规定从字符串中删除哪些字符。如果被省略,则移除以下所有字符: “\0” - NULL “\t” - 制表符 “\n” - 换行 “\x0B” - 垂直制表符 “\r” - 回车 " " - 空格 |
str_replace
定义和用法
str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。
语法
str_replace(find,replace,string,count)
参数 | 描述 |
---|---|
find | 必需,规定要查找的值 |
replace | 必需,规定替换 find 中的值的值 |
string | 必需,规定被搜索的字符串 |
count | 可选,对替换数进行计数的变 |
在了解了上述语法以后我们来看这句代码,首先通过waf对name值进行了处理,接下来通过trim函数处理掉了两边的空格,接下来通过str_replace函数将单引号替换为了空格。
接下来我们看waf的代码
function waf($value){
$Filt = "\bUNION.+SELECT\b|SELECT.+?FROM";
if (preg_match("/".$Filt."/is",$value)==1){
die("found a hacker");
}
$value = str_replace(" ","",$value);
return $value;
}
\b
匹配一个单词的边界,也就是指单词和空格之间的位置,例如’er\b’可以匹配‘’never”中的er但是不能匹配verb中的er
**.+**两边的字符一个当开头一个当结尾
以及这里有很多的正则比配笔者就不一一赘述了,带大家可以自行查阅资料(其实这个正则匹配只是想告诉大家绕过了什么,有经验的同学往往不会一个个详细查看)
根据以上内容我们最后构造payload or/**/1#'
发现返回了godjob说明注入成功,提交payload便可以得到flag
共同学习,写下你的评论
评论加载中...
作者其他优质文章