웹/los (29) 썸네일형 리스트형 los 29번 los 29번입니다. 문제를 보면 지금까지 푼 문제들과는 다른 유형임을 알 수 있습니다. 먼저 joinmail의 값을 db에 삽입해주는 쿼리문이 존재합니다. 현재 ip와 email값으로 입력 받은 정보를 db에 저장하게 됩니다. 그리고 문제를 해결하기 위해서는 no=1일 때 email값을 알아내야 문제를 해결할 수 있습니다. 이 문제 해결의 핵심은 한 번에 두 개의 정보를 저장할 수 있고, 이메일의 값으로 서브쿼리문을 이용하여 현재 db에 존재하는 정보를 가져와서 삽입이 가능하다는 뜻입니다. 즉 db에 저장되어 있는 no=1인 이메일 값을 가져와서 db에 새로 저장하여 그 결과를 출력하기 때문에 우리가 확인이 가능합니다. 아래의 쿼리문으로 db에 있는 값을 확인할 수 있었습니다. ?joinmail=fla.. los 28번 필터링 되는 문자를 확인하면 소괄호와 union이 필터링되어 있습니다. 그렇기 때문에 27번에서 사용했던 시간 기반 SQL 인젝션 공격은 하기 어려워 보입니다. 그리고 에러를 출력해주는 부분이 있는 것으로 보아 에러 기반 SQL 인젝션 공격으로 풀어야할 것 같았습니다. 공격을 위한 조건문은 case when then 문을 사용해서 문제를 해결했습니다. import requests url='https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php?' header={'Cookie':'PHPSESSID=ailfrbcn3eqpjjr7ico7nv5ptc'} ch = "0123456789abcdefghijklmnopqrstuvwxyz.. los 27번 los 27번입니다. 필터링 조건을 보면 \,/,싱글 쿼터가 필터링 되는 것을 볼 수 있는데 이때 필터링 조건문이 쿼리문을 실행한 다음 발동합니다. 그래서 이 문자들을 이용하여 쿼리문의 작성은 가능하지만 결과를 확인하기는 어렵습니다. 그래서 27번도 23번처럼 time based SQL injection을 이용해서 문제를 해결했습니다. 코드는 23번 문제의 코드와 매우 유사하기 때문에 코드와 결과의 캡쳐하는 것으로 분석을 대신하겠습니다. import requests import time url='https://los.rubiya.kr/chall/blue_dragon_23f2e3c81dca66e496c7de2d63b82984.php?' header={'Cookie':'PHPSESSID=ufj6q3ft5dp.. los 26번 los 26번입니다. 문제조건을 보면 id의 길이가 7을 넘을 수 없고, id=admin일때, no를 맞춰야 문제를 해결할 수 있습니다. 특별하게 필터링 되는 문자는 없는 것 같습니다. 그리고 is_numberic은 no의 값이 숫자인지의 여부를 반화하는 함수 인데 숫자일 경우는 그대로 no로 넣어준 값을 반환하고 숫자가 아닐 경우에는 1을 반환합니다. 일단 id의 조건을 이용하여 문제를 해결하여야 하는데 이때 주석 문자를 이용하여 뒤의 no의 내용을 무효화할 수 있습니다. 그래서 '||no los 25번 los 25번입니다. 문제 코드를 보면 1차 쿼리문을 만족 시켰을 때 1차 쿼리문의 결과 값으로 2차 쿼리문을 실행합니다. 이때 2차 쿼리문의 결과의 id가 admin일 경우에 문제가 풀리는 것 같습니다. 일단 싱글 쿼터가 필터링 되어 있기 때문에 1차 쿼리문의 싱글 쿼터를 우회해주기 위해 los 17번에서 했던 것처럼 \를 넣어줍니다. 이렇게 되면 'and pw='가 묶이게 되어 pw에 들어가는 값이 id값으로 설정되게 됩니다. 그리고 처음에 단순히 admin과 admin을 아스키코드로 바꾼 0x61646d696e를 넣어지만 문제가 해결되지 않았습니다. 그래서 여러가지 삽질을 하던 도중 union select 문으로 여러 개의 칼럼을 가져와봤습니다. 그러니 위 사진처럼 2번째 쿼리문이 출력되었다는 것을.. los 24번 los 24번입니다. 24번은 23번과 유사하지만 preg_match로 인해 sleep 함수와 benchmark함수를 사용할 수 없습니다. 따라서 23번에서 사용했던 time based SQL injection을 사용하지 못합니다. 그래서 if문을 통해 결과값을 다르게 출력하는 방식으로 하여 출력할려고 했습니다. 먼저 order=1일 때 결과입니다. admin의 이메일은 알 수 없고 score=50, rubiya의 score가 100입니다. 그 뜻은 socre를 통해 정렬해도 id로 정렬했을 때와 같은 결과값을 출력합니다. 이때 if문을 통해 조건이 참이면 score를 기준으로 출력하고 아니면 아예 출력이 불가능하게 하기 위해 쿼리문을 ?order=if(id='admin' and length(email).. los 23번 los 23번입니다. order의 값에 따라 쿼리문을 통해 값을 가져오기 때문에 먼저 order=1을 전달해보았습니다. order 1일 때, id=admin과 id=rubiya에 해당하는 id,email,score값이 출력되게 됩니다. 이때 우리는 email값을 blind SQL injection으로 공격하여 email을 알아내면 될 것 같습니다. 먼저 이메일의 길이를 알아내야 합니다. 이때 time based SQL injection기법을 사용했습니다. ?order=if(id='admin' and length(email)>n,sleep(1),1) 위의 쿼리문을 이용해서 id=admin이면서 email의 길이를 n자리에 계속 대입해보면서 알 수 있습니다. 이때 만약 이메일의 길이가 일치할 경우 sleep.. los 22번 los 22번입니다. 필터링 조건을 보면 cas when 문과 if문 그리고 time based SQL injection에서 사용할 수 있는 sleep, benchmark 함수도 되어 있습니다. 이 문제도 union select를 이용한 error baed SQL injection을 이용해야 할 것 같습니다. 여기서 주목할 점은 에러가 발생할 경우 에러가 발생했다는 표시가 뜨지 않는다는 것입니다. 먼저 ?pw=' or id='admin' and (select 1 union select (length(pw)=n))%23 에서 n값을 바꿔가면 글자 길이를 확인했습니다. 삽질 결과 길이는 8이였습니다. 여기서 가져올 수 있는 조건문이면 에러가 발생하지 않기 때문에 에러가 발생하지 않고 정상적으로 실행된 pw의.. 이전 1 2 3 4 다음