'Solve Problem/LOS'에 해당되는 글 30건

반응형


문제를 보자.

전 문제와 비슷해보인다.

sleep과 benchmark, _가 막힌것으로 보아 time based는 아니다.

error based를 이용해야하는데 이전 문제를 풀 때 사용한 if문이 막혔다.


이전과 다른 점이라면 exit() 안에 mysql_error()가 없어서 정확히 어떤 에러가 나왔는지는 알 수 없다.

하지만 뭐.. 에러가 나냐 안나냐만 알면 되므로 그건 중요하지 않다!


먼저 알아본 것은 if와 case 대신 사용할 수 있는 함수가 있는지였다.

그 결과 나온 함수들은 coalesce() , nvl() 두가지인데 nvl()함수는 오라클 전용이란다.. ( mysql에서 같은 의미의 함수는 ifnull() )


* coalesce()함수는 처음 파라미터부터 시작하여 null이 아닌 값을 출력해준다고 한다.

ex) coalesce(null,1,2.5,"test") 의 경우 1이 출력

coalesce(null,null,null,3,"test') 의 경우 3이 출력


하지만 이 함수의 경우 에러를 출력시키지 않는다는 함정이 있다..

우리는 에러를 출력시켜야한단 말이다 ㅠㅠ


일단 union 과 select를 막지 않았으므로 아까처럼 select 1 union select 2를 사용하는 것 아닐까?


query : select id from prob_dark_eyes where id='admin' and pw='' or id='admin' and (select 1 union select 2 where length(pw)>100)#'


이와 같이 진행하면 된다.

만약 pw의 길이가 100이 넘는다면 select 2도 동작을 하여 and부분에 union으로 두가지 select가 되어 에러가 출력된다.


query : select id from prob_dark_eyes where id='admin' and pw='' or id='admin' and (select 1 union select 2 where length(pw)=8)#'


해당 쿼리 실행시 에러가 발생되어 빈 화면이 떴다. where 부분의 조건이 맞아 select 2가 동작했기 때문!


efficient blind sql injection를 이용하여 문제 해결






반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] 문제풀이 11번 - 20번  (0) 2019.05.26
[LOS] 문제풀이 1번 - 10번  (0) 2019.05.10
[LOS] 21번 문제  (0) 2018.02.22
[LOS] 20번 문제  (0) 2018.02.14
[LOS] 19번 문제  (0) 2018.02.11
블로그 이미지

rootable

,
반응형


문제를 보자.


sleep과 benchmark를 차단하고 있다. 이 의미는 time based sql injection을 하라는 것 아닐까?


?pw=' or 1# 


으로 넣어서 무조건 결과가 True일 때에도 아무런 반응이 없다.

따라서 time based를 이용하는 것이 맞아보인다.


이 문제를 알아보기 위해 Time Based SQL Injection에 대해 공부한 것을 간단히 정리해보자.

* Time Based SQL Injection

 - Mysql에서 사용가능한 함수 : sleep(duration), benchmark(횟수, 쿼리)

 ex) sleep(5) : 5초동안 지연

      benchmark(20000,MD5('rootable')) : MD5('rootable') 을 20000번 실행

 - 정상적으로 지연됐다면 반환 값은 0

 - 반환된 결과 레코드에 따라 (레코드 수 X duration) 만큼 지연된다.

 ex) 쿼리 결과 레코드가 2개라면 sleep(2)했을 때 총 지연시간은 4초


* SQL Injection에 적용

 - ?pw=aaa" and sleep(1)-- 일 경우 만약 pw가 aaa라면 1초 지연될 것이고 아니라면 지연이 되지 않을 것이다. 왜냐하면 지연은 결과 레코드에 따라 정해지기 때문

 - and 대신 or을 사용하면 항상 지연되기 때문에 pw를 알 수 없다.


음........ 생각을 해봤는데 time based sql injection은 Sleep(), benchmark(), 데이터가 많은 information_schema같은 컬럼을 이용하는 방법이 있는데 문제에서 _를 막기 때문에 사용할 수 없다.


* 참고 - information_schema를 이용한 time based sql injection


그렇다면 다른 방법을 찾아봐야지!

?pw='을 했을 때 에러가 발생하는 것을 알 수 있다.

이는 if(mysql_error()) exit(mysql_error()); 때문인데 이를 이용하여 Error based sql injection으로 방향을 잡아보았다.


결국 풀이를 봤다....ㅠㅠ

일단 방향은 Error based인데 Error를 통해 데이터를 추출하는 것이 아니라 blind처럼 참일 때는 에러가 안뜨고, 거짓이면 에러가 뜨는 방식으로 진행해야한다.

그러기 위해 코드는 아래와 같다.


query : select id from prob_iron_golem where id='admin' and pw='' or id='admin' and if(length(pw)>10,2,(select 1 union select 2))#'


먼저 싱글쿼터로 이전 쿼리를 닫아준 뒤 or로 이어주면서 admin의 패스워드 길이를 확인할 수 있는 쿼리이다.

만약, pw가 10보다 크다면 2가 선택되어 에러가 발생하지 않지만 10보다 크지 않다면 select 1 union select 1가 되어 result가 2개가 되어 아래와 같은 에러가 뜬다.

Subquery returns more than 1 row


이제 이것을 이용하여 pw를 찾아보자.

length(pw)>15에서는 에러가 발생되지 않고 length(pw)>16 에서 에러가 발생하였으므로 pw의 길이는 총 16자.


ord(substr(pw,1,1))=33를 통해 pw의 첫번째 자리의 ascii값은 33임을 확인하였다.

그 값은 '!'이다.

반복한 결과 pw의 4번쨰 자리까지 !이고 그 뒤는 null인 것을 확인할 수 있다.




반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] 문제풀이 1번 - 10번  (0) 2019.05.10
[LOS] 22번 문제  (0) 2018.03.02
[LOS] 20번 문제  (0) 2018.02.14
[LOS] 19번 문제  (0) 2018.02.11
[LOS] 18번 문제  (0) 2018.02.10
블로그 이미지

rootable

,
반응형


문제를보자.

pw를 파라미터로 입력하여 그 결과 id가 admin이면 문제가 풀린다.

특징적인 것은 id='guest' 뒤에 주석인 #이 있다는 점이다.


주석을 어떻게 우회할 수 있을까


이는 # 주석이 한줄 주석이라는 점을 이용하면 된다.

%0a를 이용하면 line feed가 되어 다음줄로 쿼리가 넘어가기 떄문에 # 주석의 영향를 받지 않는다.


따라서 pw=%0a+or+id=%27admin 라고 입력하게 되면 아래와 같이 쿼리가 날아간다.


select id from prob_dragon where id='guest'# and pw=' or id='admin'


그 결과 Hello Guest가 뜬다.


쿼리는 정상 작동하는데 Guest가 결과에 있어 Guest가 뜨는 듯 하다.

따라서 pw에 잘못된 값을 입력해서 guest가 뜨지 않게 해주면 admin이 출력된다.


pw=%0a+and+pw=%271%27+or+id=%27admin



반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] 22번 문제  (0) 2018.03.02
[LOS] 21번 문제  (0) 2018.02.22
[LOS] 19번 문제  (0) 2018.02.11
[LOS] 18번 문제  (0) 2018.02.10
[LOS] 17번 문제  (0) 2018.02.08
블로그 이미지

rootable

,
반응형


문제를 풀자


pw 파라미터를 get 방식으로 받아서 만약 id값이 존재하면 Hello와 함께 출력해준다.

그리고 addslashes를 거친 후 해당 pw를 처리한 결과가 실제 admin의 pw와 같으면 문제가 풀린다.


blind sql injection을 해야한다.


여기서 필터링 것을 보면 regex와 like가 필터링된 것을 볼 수 있다.

like는 '%가%'처럼 검색할 수 있는 것이란걸 이미 알고 있다.

regex는 검색 결과 like처럼 정규식으로 검색할 수 있는 기능이다.

( 참고 : http://phpdev.tistory.com/entry/%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B2%80%EC%83%89-regexp )


왜 정규식을 막았을까? 라는 의문을 가지며 문제풀이를 시작하였다.


가장 간단하게 이전처럼 시작하였다.

pw=' or ascii(substr(pw,1,1))>0#

을 넣어주었다.


하지만 예상처럼 Hello ID 부분이 뜨지 않았다.

뭘까? 란 생각에 -200을 했는데 Hello Admin이 떴다. 뭐지??

범위를 줄였더니 >0에서는 안되지만 >-1에서는 된다.

pw의 첫번째자리가 ascii코드표로 0인가보다.


이는 NUL값이다.


길이 확인시 40이라고 나와서 확인해본 결과 첫번째부터 모두 NUL값으로 나왔다. 이상해서 생각해보다가 비밀번호가 한글일 수도 있지 않을까란 생각을 하였다.


찾아본 결과 확장 ASCII 코드가 있었다. 이는 128번부터 255번까지 존재한다.

이를 위해서는 ascii() 대신 ord()를 이용해야한다.


pw='' or ord(substr(pw,1,1))=184#'


그 결과 첫번째 글자의 ascii 코드는 184임을 확인하였다.

그 이후 efficient blind sql injection 코드를 이용해서 답을 구하려했지만 디코딩이 복잡하여 그냥 숫자로 출력되게 한 뒤 온라인 ASCII Converter를 이용하였다.



답은 ¸ùÅ°ÆÐÄ¡¤»


반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] 21번 문제  (0) 2018.02.22
[LOS] 20번 문제  (0) 2018.02.14
[LOS] 18번 문제  (0) 2018.02.10
[LOS] 17번 문제  (0) 2018.02.08
[LOS] 16번 문제  (0) 2018.02.08
블로그 이미지

rootable

,
반응형


문제를 보자.


pw 파라미터를 GET방식으로 받고 그 값의 길이가 6이 넘어가면 안된다.

그 값을 통해 처리한 쿼리의 결과 id값이 존재하면 문제가 풀리는데 특이점은 id!='admin'이 있다는 점이다.


pw가 괄호로 막혀있기 때문에 가장 간단하다고 생각한 것은 ')||1# 이다.


하지만 No Hack ~_~ 이 떠버린다 ㅠㅠ

이유를 찾아보니 주석처리를 막아두었다. #과 -를 막았다

주석을 이용하지 말라는 의미이다.

즉, 잘 이어보라는 의미인데... 흠


결국 힌트를 받았다.

Mysql 의 auto type cast를 이용하라고 한다.


간단하게 설명하자면 string의 column값을 Int형과 비교하게 하면 string은 항상 0이 return되어 =0을 하게되면 결과가 모두 뜬다는 것이다.



첫번째는 string column인 col1과 0을 비교할 경우 col1은 0이 출력되어 0=0이 되어 모든 컬럼이 출력된다.


이를 문제에 대입시킬 경우 (')=0을 할 경우 모두 0이 되어 모든 컬럼이 출력되는 것이다.


그렇다면 필요한 글자 수는 ')=0 이렇게 최소 4개이고 그 뒤에 주석으로 2개를 사용하면 된다.


mysql에서 사용할 수 있는 주석에 #과 --를 제외하고 사용할 수 있는 주석이 있을까?


;%00 을 이용해서 할 수 있다!

;을 이용할 경우 쿼리의 나머지부분은 다음 쿼리로 실행시키려하기 때문에 %00을 통해 문장이 끝났다는 것을 알려주면 된다.


이를 통해 클리어!


pw=')=0;%00



** 참고

 - Mssql 의 경우 auto type cast가 되지 않아 error based sql injection이 편하다 (다른 형태로 비교하려고 하면 쿼리결과를 error에 출력시켜주기 때문)

 - 하지만 mysqql 의 경우 auto type cast때문에 error에 쿼리 결과가 뜨지 않는다. 따라서 다른 방식을 이용해야한다!!


select * from (select name_const(version(),1),name_const(version(),1))a

select * from table where 1=1 and ExtractValue(1,concat(0x01,version()))

select * from table where 1=1 and UpdateXML(1,concat(0x01,version()),1)

select * from table where (@:=1)or@ group by concat(@@version,@:=!@)having@||min(0)

출처: http://itstarter.tistory.com/394

반응형

'Solve Problem > LOS' 카테고리의 다른 글

[LOS] 20번 문제  (0) 2018.02.14
[LOS] 19번 문제  (0) 2018.02.11
[LOS] 17번 문제  (0) 2018.02.08
[LOS] 16번 문제  (0) 2018.02.08
[LOS] 15번 문제  (0) 2018.02.08
블로그 이미지

rootable

,

[LOS] 17번 문제

2018. 2. 8. 17:17

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[LOS] 16번 문제

2018. 2. 8. 17:00

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[LOS] 15번 문제

2018. 2. 8. 16:51

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.