목록분류 전체보기 (194)
Information Security
[Lord Of Sql injection] golem if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe"); 이때까지 했던대로 ' or id='admin' and length(pw)=8 %23을 injection하여 admin 패스워드의 길이를 알아내려고 했는데 preg_match()함수에 의해 or, and, =이 차단된다. 또, ' or id='admin' and ascii(substr(pw,1,1))=54 %23로 패스워드를 한 글자씩 알아내려 했는데 substr() 함수가 차단된다. 우회 방법은 다음과 같다. or -> || and -> &&(%26%26) = -> like 절 http://www.w3big.com/ko/mysql/mysq..
$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"; 뒤에 and로 거짓(1=0)이 되도록 해서 뭔가 안될 것 같은 느낌이 든다. 그리고 id는 guest로 되어 있지만 admin이 들어가야 문제가 풀린다. 이제까지 한 것처럼 or id='admin'을 injection하고 뒤의 거짓은 주석 처리로 무시해 버리면 문제가 해결된다.
[Lord Of Sql injection] vampire str_replace(search, replace, subject) subject에서 발견한 search를 replace로 교체하는 함수이다. $_GET[id] = str_replace("admin","",$_GET[id]); id에 admin을 입력하면 id의 값을 비워버린다. 그런데 http://php.net/manual/kr/function.str-replace.php에서 위와 같은 정보를 얻을 수 있었다. str_replace()는 방금 전에 푼 troll 문제의 ereg 함수 같이 대소문자를 구분하는 함수이다. 그러므로 이번에도 대소문자를 섞은 admin을 입력하면 문제가 풀린다.
[Lord Of Sql injection] troll id가 admin이면 통과이기 때문에 쉬워 보이지만 ereg 함수에 의해 id에 전달되는 값이 admin이면 HeHe가 출력된다. 그런데 ereg 함수에게는 약점이 있다. admin이 발견되면 true를 반환하기는 하지만 소문자로된 admin이 발견될 때만 인식하는 대소문자를 구분하는 함수라는 것이다. 그러므로 ADMIN과 같이 admin을 입력하되 대소문자를 아무렇게나 섞어서 입력해주면 ereg 함수를 우회하여 문제를 통과할 수 있다.
[Lord Of Sql injection] orge darkelf 문제와 같이 or, and를 차단하고 있다. or는 ||로, and는 &&(%26%26)로 대체할 수 있다. 이번에도 패스워드를 직접 알아내야 한다. 패스워드의 길이는 8이다. 또 8글자를 일일이 알아내려면 힘이 든다. 그러므로 이번에는 자동화 스크립트를 사용할 것이다. 스크립트의 실행 결과는 위와 같다.
[Lord Of Sql injection] darkelf 이번에는 or, and를 사용할 수 없다. or는 ||로 대체할 수 있다.
[Lord Of Sql injection] wolfman goblin 문제와 거의 유사한데 다른 점은 쿼터 대신 공백이 차단된다는 것이다. 일단 id가 admin이면 참이 되도록 pw에 ' or id='admin'%23을 삽입해야 한다. 여기서 공백이 두 번 들어가는데, 차단되므로 다른 문자로 대체해야 한다. 주석(/**/)으로 공백 우회 성공 https://www.w3schools.com/tags/ref_urlencode.asp 아스키 제어 문자(ASCII control characters)를 URL Encoding한 값을 사용할 수도 있다.
[Lord Of Sql injection] orc 이 문제에는 중요한 내용이 많이 나온다. 이 문제를 풀었으면 이 다음에 나오는 많은 문제를 쉽게 풀 수 있을 것이다. $_GET[pw] = addslashes($_GET[pw]); 이전에 했던 것처럼 참으로 만들면 가능할 것이라 생각했지만 addslashes()에 의해 싱글 쿼터가 차단된다. pw를 string으로 받기 때문에 addslashes()를 우회할 수도 없다. if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); 그리고 쿼리 실행 결과로 출력된 result의 pw와 GET 방식으로 전달받은 pw가 같아야만 문제를 통과한다. 패스워드를 직접 알아내야 한다는 것이다. 어떻게 해야 ..
[Lord Of Sql injection] goblin $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; where 절을 보면 id는 guest로 정해져 있다. if($result['id'] == 'admin') solve("goblin"); 하지만 쿼리 결과로는 id가 admin이여야 문제가 풀린다. GET 방식으로 정의할 수 있는 변수는 no 뿐이다. 그리고 no는 string으로 값을 받지 않기 때문에 numeric injection이 가능하다. if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); no=1 or id='admin'으로 id에 admin을 ..
[Lord Of Sql injection] cobolt if($result['id'] == 'admin') solve("cobolt"); 여기서 중요한 것은 id가 admin이면 통과라는 것이다. 패스워드가 md5() 함수로 암호화되어서 뭔가 어렵게 느껴지지만 쉽게 생각해야 한다. => id를 admin으로 주고, 뒤를 주석 처리해서 id만 입력하면 쿼리가 실행되도록 하면된다.