목록Web Hacking/Lord Of Sql injection 풀이 (20)
Information Security
[Lord Of Sql injection] dragon $query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'"; where 절에서 id='guest' 뒤를 주석처리 해서 pw에 어떤 값을 입력해도 모두 무시된다. 하지만 #은 한 줄 주석이다. 다음 줄로 넘겨서 주석을 빠져나와 id가 admin이 되도록 해야 한다. 개행 문자(new line, '\n')의 url encoding 값 %0A를 이용하여 다음 줄로 넘길 수 있다. 일단 pw의 값에 %0A를 삽입하면 pw=' ' 이렇게 다음 줄로 넘어가게 될 것이다. 그럼 이제 주석(#)으로 인해 쓰지 못했던 부분을 입력하면 된다. pw=' ' and pw='' or id='ad..
[Lord Of Sql injection] xavis 일단 패스워드의 길이를 구했는데 40이다. 언제 다 구하지? 하나씩 해본다. . 184, 249, 197, 176, 198, 208, 196, 161, 164, 187가 나온다. 다행히 11번째부터는 0이 나온다. 패스워드는 10글자이다. https://www.branah.com/ascii-converter 이 사이트에서 저 값들을 아스키 코드로 변환했다. 확장 아스키 값이었다. 이 외계어가 패스워드이다. 더 쉽게 하려면 역시 스크립트를 이용하면 된다.
[Lord Of Sql injection] nightmare 정말 악몽 같은 문제이지만 오~~래 고민하면 해결할 수 있을 것이다. 힌트: auto type cast if(strlen($_GET[pw])>6) exit("No Hack ~_~"); $query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'"; pw가 (' ') 안에 들어가게 되는데, 글자 수는 6자 이하로 제한된다. 문자열은 숫자와 비교하면 자동으로 0으로 치환된다고 한다. 여기서 비밀번호가 문자열인 id는 user2 뿐이다. pw=0이 참이되는 id는 pw가 문자열인 user2이다. pw=('')=0 '' 문자열이 0에 의해 자동으로 int로 형 변환(a..
[Lord Of Sql injection] succubus 싱글 쿼터가 차단 되어서 string injection을 할 수 없을 것 같았다. 하지만 \는 차단하고 있지 않다. \를 이용하여 싱글 쿼터를 무력화(escape)시킬 수 있다는 것이다. id=' \' and pw=' ' id의 닫는 싱글 쿼터를 무력화시키면 어떻게 될까요? id=' \' and pw=' ' id의 여는 쿼터가 pw의 여는 쿼터와 연결되어 id에는 and pw=이 들어가게 될 것이다. id=' and pw=' or true로 참으로 만들고, 뒤의 싱글 쿼터는 주석 처리하면 문제가 해결된다.
[Lord Of Sql injection] zombie_assassin ereg 함수로 싱글 쿼터를 차단하고 있지만, ereg 함수는 NULL 문자 전까지만 체크한다는 취약점이 존재한다. https://www.w3schools.com/tags/ref_urlencode.asp NULL 문자를 URL-encoding한 값은 %00이다. %00을 삽입하여 ereg 함수가 체크를 더이상 못하게 하고 참으로 만들면 zombie_assassin clear!
[Lord Of Sql injection] assassin 쿼리의 결과로 id가 admin이어야 한다. $query = "select id from prob_assassin where pw like '{$_GET[pw]}'"; where 절에서 = 대신 like 절을 사용하여 패스워드를 확인하고 있다. 이를 이용하여 문제를 풀어야 할 것 같다. https://www.w3schools.com/sql/sql_like.asp llike 절은 컬럼에서 wildcard 문자를 사용하여 특정 문자열을 조회할 수 있다. _를 사용하여 패스워드가 8글자인 것을 알아냈다. if($result['id']) echo "Hello {$result[id]}"; if($result['id'] == 'admin') solve("a..
[Lord Of Sql injection] giant query : select 1234 fromprob_giant where 1 $query = "select 1234 from{$_GET[shit]}prob_giant where 1"; 쿼리를 보면 from과 table 이름이 붙어있다. 이런 경우에 syntax error가 발생한다. from과 prob_giant 사이에 공백을 삽입해야 한다. if(strlen($_GET[shit])>1) exit("No Hack ~_~"); 변수 shit은 길이가 1이하로 제한된다. 변수 shit에 공백을 우회하는 문자의 url encoding 값을 넣어주면 공백이 삽입될 것이다. (wolfman 문제 풀이 참고: http://leeeeye321.tistory.com..
[Lord Of Sql injection] bugbear 이번에는 공백도 like도 차단하고 있다. or이 차단되어 있어서 ord() 함수도 사용할 수 없다. 하지만 이것도 대체할 수 있는 함수가 있다. HEX() function MySQL HEX() returns a string representation of a hexadecimal value of a decimal or string value specified as an argument. If the argument is a string, each character in the argument is converted to two hexadecimal digits. like를 in으로 대체하고 구한 패스워드의 길이는 8이다. ord() 함수를 hex..
[Lord Of Sql injection] darkknight 이번에는 싱글 쿼터를 차단하여 string injection을 할 수 없다. 하지만 변수 no도 GET 방식으로 정의하고 있기 때문에 numeric injection을 해주면 될 것이다. no의 값에서 싱글 쿼터(') 를 차단하고 있으므로 더블 쿼터(")로 대체했다. ascii() 함수는 ord() 함수로 대체할 수 있다. MySQL ORD() returns the code for the leftmost character if that character is a multi-byte (sequence of one or more bytes) one. If the leftmost character is not a multi-byte characte..
[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..