一、背景
最近报名参加了一个CTF比赛,学长介绍了个网站,实验吧。开始了做题之旅。说句实话,网站还行,就是那个假设题目的服务器不太行。老是出现无响应的情况。
遇到一个题目名称为简单的登录题的问题
二、题目分析流程
- 题目
格式:flag:{xxx}
解题链接: http://ctf5.shiyanbar.com/web/jiandan/index.php - 做这种题目的思维习惯:
- 如果是get请求。有url参数立即考虑sql注入。
- 没有的话,用谷歌浏览器的调试功能,看请求头和响应头
- 打开看看,是个登录页面,二话不说随便输入了内容并且提交了。
- 提交了显示个hello,好吧是post请求,没url参数。于是先看看请求头和响应头。
- 果然发现了提示内容
- 果断访问test.php,出现了熟悉的php代码
- 谷歌浏览器里面看更香
- 代码
define("SECRET_KEY", '***********');
define("METHOD", "aes-128-cbc");
error_reporting(0);
include('conn.php');
function sqliCheck($str){
if(preg_match("/\\\|,|-|#|=|~|union|like|procedure/i",$str)){
return 1;
}
return 0;
}
function get_random_iv(){
$random_iv='';
for($i=0;$i<16;$i++){
$random_iv.=chr(rand(1,255));
}
return $random_iv;
}
function login($info){
$iv = get_random_iv();
$plain = serialize($info);
$cipher = openssl_encrypt($plain, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv);
setcookie("iv", base64_encode($iv));
setcookie("cipher", base64_encode($cipher));
}
function show_homepage(){
global $link;
if(isset($_COOKIE['cipher']) && isset($_COOKIE['iv'])){
$cipher = base64_decode($_COOKIE['cipher']);
$iv = base64_decode($_COOKIE["iv"]);
if($plain = openssl_decrypt($cipher, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)){
$info = unserialize($plain) or die("<p>base64_decode('".base64_encode($plain)."') can't unserialize</p>");
$sql="select * from users limit ".$info['id'].",0";
$result=mysqli_query($link,$sql);
if(mysqli_num_rows($result)>0 or die(