首页 > 其他分享 >BugKu_never_give_up

BugKu_never_give_up

时间:2023-03-24 19:12:53浏览次数:27  
标签:GET BugKu no never up substr 111 id

if(!$_GET['id'])
{
	header('Location: hello.php?id=1');
	exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
	echo 'no no no no no no no';
	return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
	$flag = "flag{***********}";
}
else
{
	print "never never never give up !!!";
}


?>

2023年2月23日遇到的一个php代码审计的题目,这个题目的考察知识点非常多,写个wp记录一下。

if(!$_GET['id'])
{
	header('Location: hello.php?id=1');
	exit();
}

如果id=0或者没有设置id的值,则跳转id=1,程序退出

$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
	echo 'no no no no no no no';
	return ;
}

三个参数 id a b ,其中a参数的值不能有'.',如果有,则输出'no no no',并返回。

$data = @file_get_contents($a,'r');

file_get_contents从$a里读取数据,然后将数据给变量$data存储。

if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
	$flag = "flag{***********}";
}
else
{
	print "never never never give up !!!";
}

这个判断非常有意思,有很多矛盾的地方。首先data的值必须是"bugku is a nice plateform!",id必须为0(第一段代码就表示过id!=0),b的长度必须大于5,在正则匹配时,“111”和b的第一个字符拼接必须匹配到”1114“,但是b的第一个字符又不能是4。整个过程都非常矛盾,但是这正是考察php的知识点。

首先,data的值必须是"bugku is a nice plateform!",这个怎么办到?我们知道file_get_contents的参数是文件名,本质上是打开一个文件流,从流里读出文件内容。但我们并不知道哪个文件里有这个字符串信息,也没有上传接口,无法自己上传一个文件上去。这时,需要观察到本质,file_get_contents本质上是打开一个文件流,流!!!,重点是流。我们可以用php伪协议来完成。

php://input  // 读取post输入流

此时$a=php://input,然后用post传输"bugku is a nice plateform!",当file_get_contents($a)触发时,就是从Post的输入流里获取字符串“bugku is a nice plateform!”。

接着,id==0怎么绕过,毕竟一开始就判断过,id肯定不能是0,要是0,就退出程序了。但仔细看看,==在php中是弱类型比较,0bcde==0这个是成立的。为什么呢?因为数字之间比较时,非数字不参与比较。因此id=0a就可以绕过。

strlen($b) >5 没什么可说的,个数大于5就好。

eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4),按照普遍的思路来说

eregi("111".substr($b,0,1),"1114")   

eregi()匹配函数,匹配到则是True

"111".substr($b,0,1)  ->  拼接 “111”和  $b的第一个字符  (.是拼接字符串的意思)

比如$b=4321    那么  "111".substr($b,0,1) 就是1114

但是,绕过就是不走寻常路。令b=*12345。*号是通配符,匹配所有。因此,直接绕过!!!

整体构造如下:

标签:GET,BugKu,no,never,up,substr,111,id
From: https://www.cnblogs.com/Jiamuu/p/17253048.html

相关文章

  • 2023MathorCup数学建模A题思路
    0赛题思路(赛题出来以后第一时间分享)企鹅qun7144526211竞赛信息MathorCup高校数学建模挑战赛(以下简称“竞赛”)是由中国优选法统筹法与经济数学研究会主办的面向全日......
  • Unity的LayoutGroup刷新会延迟一帧的问题
    在去年遇到过LayoutGroup完全不刷新的问题:https://www.cnblogs.com/strawberryPudding/p/15593869.html当时的解决方案是关了之后等一帧再开,但是也有一些问题。在时不时需......
  • on duplicate key update
    onduplicatekeyupdate是mysql的特殊用法,当insert操作出现主键冲突时执行更新操作,样例如下:insertintozhi_test.bd_user(id,user_code,user_name,create_time,upd......
  • m1 docker mysql8/arm64v8 解决 `only_full_group_by` 问题
    m1dockermysql8/arm64v8解决only_full_group_by问题问题原因MySql从5.7版本开始默认开启only_full_group_by规则,规则核心原则如下,没有遵循原则的sql会被认为是不合......
  • C#:元组<Tuple>
    C#元组是一种数据结构,它可以将多个不同类型的值组合在一起。它类似于数组,但是元组可以包含不同类型的值,而数组只能包含相同类型的值。在C#中,元组是通过Tuple类来实现的。......
  • Windows 10 1909 (Updated 2020-01-23)
    Windows10商业版(含教育版、企业版、专业版、专业教育版、专业工作站版)SHA1:67F9C7D6EC42CB1257697516F134799E020DE8E3ed2k://|file|cn_windows_10_business_editions_......
  • Windows 10 1909 (Updated 2019-12-17)
    Windows10商业版(含教育版、企业版、专业版、专业教育版、专业工作站版)SHA1:ee016317989ca607d786baa269fef756ebae9664ed2k://|file|cn_windows_10_business_editions_......
  • Windows 10 2004 (Updated 2020-05-12 v19041.208)
    Windows10商业版(含教育版、企业版、专业版、专业教育版、专业工作站版)SHA1:ED65CC6F3B4F90FDBDAB949BA6286708E8DCF0F1ed2k://|file|cn_windows_10_business_editions_......
  • Windows 10 2004 (Updated 2020-07-24 v19041.388)
    Windows10商业版(含教育版、企业版、专业版、专业教育版、专业工作站版)SHA1:77C83FF5329A5685649DA8A2D0936C045A0B25CAed2k://|file|cn_windows_10_business_editions_......
  • CentOS 7 : wpa_supplicant (CESA-2021:0808) Vulnerability_day 16
    今天要跟大家分享的是关于CentOS的系统缺陷。下面是关于这个问题的具体的描述:TheremoteCentOSLinux7hosthasapackageinstalledthatisaffectedbyavulnerabil......