본문 바로가기
CTF_write_up/h3xor

H3XOR_webhacking?(php 해석 문제)

by 강깅꽁 2017. 1. 8.

<?php
    
include('config.php'); // flag here!!
    
$string urldecode($_GET['foo']);
    if (
$string == 'admin') die('out1');
    else 
$string 'admin';
    if (
$string != 'admin') die('out2');
    if (
'admin' != 'admin') die('out3');
    else 
$string urldecode($_GET['foo']);
    if (
$_GET['bar']) $string $string.'/'.substr($_GET['bar'], 031);
    
$hash '0e747318923710937801923789017319'// hashing twice
    
if ($_GET['foo']) $account explode('/'$string);
    if (isset(
$account) && strlen($account[1]) != 32) die('out4');
    if ((!
$_GET['bar'] || !isset($_GET['bar'])) && $_GET['foo']) die('out5');
    if (
md5($account[1]) == $hash) die($flag);
    
show_source(__FILE__);
?>


상당히 많은 시간을 로직 분석에 쏟았다.

결론은

foo에는 admin이외의 어떠한 값이 들어가도 되며 bar에는 1이라는 최소한의 값만 들어가도 된다는 것

$account라는 변수는 무조건 설정 되어 있어야 하며 설정 될려면 foo에 파라미터를 넘겨야 함.

explode('/',$string);는 $string에 있는 값에서 /를 기준으로 배열로 나눔

if (isset($account) && strlen($account[1]) != 32) die('out4');

이 부분에서 길이 32개를 만족시켜주어야 한다. 


즉 

foo=admin/sVfMpo5axzo6wJAdOL9yYCbodHVn3rxv&bar=111

위와 같은 쿼리로 해당 로직을 모두 만족 시킬 수 있다.

문제는 md5 해슁시 0e를 뽑아내는 32자리의 문자열을 구해야 하는데 이것을 구하느라 컴퓨터가 터질 뻔 했다 ㄸㄷ..


32자리 랜덤 문자열 구하는 코드