[ctfshow web入门] web19
前置知识
php以$
开头,并以下滑或字母开头的,被认为是变量。$_GET
$_POST
等可以认为它是关键字,这两个代表函数
在php中 ==
是相等,其中可能伴随着类型转换,===
是全等,必须类型和值完全相等
$user = $_GET['user'];
从get中获取username的值
例如url/index.php?user=test1
,若$user = $_GET['user'];
,那么$user === "test1"
$user = $_POST['user'];
从post中获取username的值
例如url/index.php?user=test2
,若$user = $_POST['user'];
,那么$user === "test2"
信息收集
抓包,看载荷,密码被加密了
载荷是post提交的内容
看到源代码
<body>
<form action="#" method="post" id="loginForm" >
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="pazzword" id="pazzword"><br>
<button type="button" onclick="checkForm()">提交</button>
</form>
</body>
<script type="text/javascript">
function checkForm(){
var key = "0000000372619038";
var iv = "ilove36dverymuch";
var pazzword = $("#pazzword").val();
pazzword = encrypt(pazzword,key,iv);
$("#pazzword").val(pazzword);
$("#loginForm").submit();
}
function encrypt(data,key,iv) { //key,iv:16位的字符串
var key1 = CryptoJS.enc.Latin1.parse(key);
var iv1 = CryptoJS.enc.Latin1.parse(iv);
return CryptoJS.AES.encrypt(data, key1,{
iv : iv1,
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
}).toString();
}
</script>
<!--
error_reporting(0);
$flag="fakeflag"
$u = $_POST['username'];
$p = $_POST['pazzword'];
if(isset($u) && isset($p)){
if($u==='admin' && $p ==='a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04'){
echo $flag;
}
}
-->
</html>
尝试登录
解法一:
我实在看不懂那一坨加密代码,那请看最后那段 用户名=amdin
,密码=a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04
直接post账号和加密后的密码
可以使用google或火狐的hackbar插件,这非常方便。也可以使用burpsuite抓包用重放器重发,后续我会讲到burpsuite>
或者使用burpsuite抓post的包,也就是输入账号密码后点击提交那个包。随后发送到repeater,修改post内容,一般post内容在最下面,与请求头之间空一行
解法二:
我太NB了,居然看懂了那一坨加密代码。
AES加密,模式CBC,填充:ZeroPadding,密钥:0000000372619038,偏移:ilove36dverymuch
密文:(hex) a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04
解密网站:https://tool.lvtao.net/aes
拿到密码后输入admin
i_want_a_36d_girl
即可拿到flag
这里不拓展加密解密,这个内容非常庞大,我们大概知道是那种密码,怎么用就可以了,不需要学会它。
web 目录 web