본문 바로가기
반응형

워게임58

[los - SQL injection] nightmare ( 18단계 ) [los - SQL injection] nightmare ( 18단계 ) - pw=(' ')=0 - 주석문자 대체: #, - -> ;%00 ! mysql에서 '1234'=1234 같은걸로 처리한다. [ 풀이과정 ] nightmare는 if($result['id']) 조건이 만족되면 문제가 풀리게 된다.여기서는 pw에 들어가는 입력값이 prob _ . ( ) # - 문자가 preg_match() 함수로 인해서 필터링이 된다.그리고 pw의 길이는 6을 넘으면 안되는 제약 또한 있다...그렇다면 6개의 문자만을 이용해서 이 문제를 풀어내야한다. SQL에서는 pw=('')=0과 같은 쿼리를 허용해준다.이 특성을 잘 이용해보면 문제가 풀리는 방법이 보인다. 주석 문자가 막힌 부분은 ;%00으로 해결을 할수가 있다.. 2017. 9. 24.
[los - SQL injection] succubus ( 17단계 ) [los - SQL injection] succubus ( 17단계 ) [ 풀이과정 ] succubus는 id와 pw 모두 싱글쿼터가 preg_match() 함수로 필터링이 되어있어 싱글쿼터를 우회할 방법은 없다..하지만 SQL 쿼리를 보면 id와 pw 둘다 입력이 가능한데 이러한 점을 이용해서 앞쪽 입력에 '\' 문자를 이용해서id의 뒷쪽 싱글쿼터를 문자로 만들어주면 id='\' and pw='' 부분이 문자가 된다.그리고 pw에 ' or 1=1 #'과 같은 참의 식을 하나 만들어주면 $result['id']안에 조회된 id 값이 들어가므로 succubus 문제가 풀리게 된다. 이번 문제는 SQL의 기본적인 특징과 센스가 있어야 했던 문제였던 것 같다... 17단계 클리어~~~~~ 2017. 9. 24.
[los - SQL injection] zombie_assasin ( 16단계 ) [los - SQL injection] zombie_assasin ( 16단계 ) [ 풀이과정 ] ereg함수의 취약점을 이용했는데 해당 함수는 NULL(%00) 문자를 만나게 되면 더이상 뒤에 문자를 점검하지 않는 특성이 있다. 해당 id값에 %00(NULL)문자를 먼저 넣어주면 이후는 필터링을 하지 않기 때문에싱글쿼터의 사용이 가능해진다.. 그래서 php는 ereg() 함수 대신에 preg_match() 함수를 사용하고 해당 함수는 아직까지는 취약점이 나오지 않은걸로 알고 있다.. 그걸 이용해서 select id from prob_zombie_assassin where id='%00' or 1=1 #' and pw='' 와 같이 쿼리를 작성하게 되면 문제가 풀린다.여기서는 ereg 함수의 취약점을 알.. 2017. 9. 24.
[los - SQL injection] assasin ( 15단계 ) [los - SQL injection] assasin ( 15단계 ) [ 풀이과정 ] like가 이미 써져있기때문에 like의 특성인 '%'를 이용해서 앞에서부터 차례대로 admin의 pw를 찾으면 된다.8%라고 입력했을때 Hello guest가 나오므로 우선순위상 admin 위에 있는것 같다.하나씩 차례대로 찾아보다 보니 832%에서 admin을 찾을수 있었다. SQL 쿼리에서 like의 특성만 잘 알고있다면 쉽게 해결할 수 있는 문제이다. 15단계 클리어~~~ 2017. 9. 24.
[los - SQL injection] giant ( 14단계 ) [los - SQL injection] giant ( 14단계 ) [ 풀이과정 ] - whitespace: 공백, 엔터, 탭 giant에서 제대로 된 whitespace 필터링이 되어있는데 공백, 엔터, 탭을 모두 필터링 해버리는걸 whitespace라고 한다.이 문제에서는 길이가 1이 넘어가면 안되기 때문에 한문자만 가지고 이 문제를 풀어야한다. whitespace를 우회하는 문자로는 %0d, %09, (), /**/, %0a, %0b, %0c, ...이 있는데여기서는 %0b라는 수직탭 문자를 이용해서 문제를 풀었다...수직탭은 일반 탭처럼 수평이 아닌 수직으로 동작한다.. 하지만 실행을 해보면 줄바꿈과 같이 한줄이 바뀌는걸 확인 할 수 있다.. %0b가 필터링 되있는 경우도 있을테니 어떤 문자가 사용.. 2017. 9. 24.
[los - SQL injection] bugbear ( 13단계 ) [los - SQL injection] bugbear ( 13단계 ) bugbear 문제 필터링 - no는 substr, ', ascii, =, or, and, ' ', like, 0x 필터링 - pw는 싱글쿼터 [ 풀이과정 ] bugbear는 if(($result['pw'] && ($result['pw'] == $_GET['pw'])) 조건을 만족하면 풀리게 된다.그러므로 여기서도 pw를 찾아서 직접 넣어줘야 해당 문제가 풀린다.. select id from prob_bugbear where id='guest' and pw='' and no=1 || unhex(hex(char(49,61,49)))식을 이용해서 참/거짓을 확인하는데 여기서는 unhex(), hex(), char()를 사용해서 1=1이라는.. 2017. 9. 24.
[los - SQL injection] darknight ( 12단계 ) [los - SQL injection] darknight ( 12단계 ) [ 풀이과정 ] darknight에서 no는 prob _ . ( ) ' substr ascii = 기호가 preg_match로 필터링 되어있고pw는 싱글쿼터가 필터링 되어있다. pw에는 싱글쿼터가 필터링 되어있어서 우회하기가 힘들고 no를 보면 numeric SQL injection을 이용할 수 있는게 보인다..select id from prob_darknight where id='guest' and pw='' and no=1 or id in (char(97,100,109,105,110)) %26%26 length(pw) like 8을 이용해서 admin의 pw 길이가 8인걸 알아냈다. substr과 ascii가 필터링 되어있지만 .. 2017. 9. 23.
[los - SQL injection] golem ( 11단계 ) [los - SQL injection] golem ( 11단계 ) [ 풀이과정 ] golem은 if(($result['pw'] && ($result['pw'] == $_GET['pw'])) 조건을 만족해야 문제가 풀린다.여기 문제에서는 prob _ . ( ) or and substr( = 기호가 preg_match()를 통해서 필터링 되어있다..보통 참/거짓을 확인할때 1=1 쓰지만 '=' 기호는 쓸수 없기 때문에 like, sleep(), char() 등을 이용해서 참/거짓을 확인한다. select id from prob_golem where id='guest' and pw='' || sleep(10) #'를 이용해서 참/거짓을 통한 인젝션 가능성을 확인을 했다. select id from prob_g.. 2017. 9. 23.