반응형


문제를 보자.


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

,
반응형


문제에 접속하면 위와 같이 뜬다.


phps란 php source의 줄임말고 php의 소스코드를 볼 수 있는 페이지이다.

해당 페이지에 접근해보자.



user_lv 이라는 쿠키에 1이라는 값을 세팅한다.

그리고 만약 user_lv의 값이 숫자 혹은 .이 아니면 1로 세팅되고

user_lv이 6이상이면 1로 바뀌며 5보다 크면 문제가 풀린다.


문제에 답이 있다.


5보다 크며 6 이상이 아닌 것은?

5.1, 5.2, 5.3... 등등



크롬의 EditThisCookie를 이용하여 user_lv의 값을 5.5로 세팅하고 다시 문제에 접근하면?



반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
[webhacking.kr] 새로운 시작  (0) 2018.02.13
블로그 이미지

rootable

,
반응형


다시 달려보자!

반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

[webhacking.kr] 5번 문제  (0) 2018.03.05
[webhacking.kr] 4번 문제  (0) 2018.03.05
[webhacking.kr] 3번 문제  (0) 2018.03.05
[webhacking.kr] 2번 문제  (0) 2018.03.04
[webhacking.kr] 1번 문제  (0) 2018.02.13
블로그 이미지

rootable

,
반응형

Find the Flag!!

Download Sharif_CTF.apk


문제를 보면 위와 같이 apk파일을 주고 Flag를 찾으라고 한다.

해당 파일을 안드로이드에 설치하고 실행시키면 Serial Number를 입력하라고 하고 잘못된 값을 넣으면 Just Keep Trying :-) 이라는 문구가 뜬다.



해당 문구를 AstroGrep으로 검색한 결과 a.smali에 존재한다고 떴다.


해당 코드를 보면 v2가 1이고 this.a.e가 unknown이 아니면 문제가 풀릴 것으로 예상된다.


v2는 this.a.IsCorrect(v0); 이므로 해당 함수로 접근해보면 아래와 같이 Native 코드 내에 선언되어있음을 알 수 있다.


그 바로 위에 adnjni라는 라이브러리를 호출하고 있는 것을 알 수 있다.

따라서 디컴파일 후 /lib/armeabi 폴더에 들어가면 libadnjni.so 가 있는 것을 볼 수 있다. 이를 분석해보자.


IDA로 열어보면 유일하게 문자열인 것과 v12부터의 배열을 비교하는 것을 볼 수 있다.

따라서 v12부터의 값을 ascii로 변경시키면 답이 나올거라 생각한다.


해당 값을 ascii converter를 이용하여 변환시켜 주었다.

그 결과값을 APP에 넣고 Login 버튼을 누르면 답이 출력된다.





반응형
블로그 이미지

rootable

,
반응형
Flag is a serial number.
문제는 위와 같이 간단하게 되어있고 apk 파일을 하나 주는 듯 하다.
( Android CTF 문제를 찾아보다가 출처에 있는 글에서 문제를 퍼왔다. )

suCTF.apk


귀차니즘으로 인해 직접 사진을 찍지는 않겠지만 우측 상단의 설정 아이콘을 누르면 라이센스를 입력하라고 하는데 잘못된 키를 입력하면 아래와 같이 뜬다.


알람에 뜬 문구를 strings.xml에서 찾아본 결과 존재하지 않았다.

소스코드에 하드코딩 되어있는지 찾아보기 위해 astrogrep으로 검색한 결과 MainActivity에 존재함을 확인하였다.



MainActivity에서 checkLicenceKey 함수를 보면 이미 라이센스를 가지고 있거나 없으면 KeyVerifier.isValidLicenceKey 함수를 거친 결과가 true이면 해당 앱을 정상적으로 모두 사용할 수 있다고 한다.


해당 함수에 들어가면



3개의 string을 받아 encrypt 함수에 넣고 그 결과가 "29a002..." 와 동일하면 true를 리턴시켜준다.


encrypt 함수를 보자.



여기서는 전달받은 3개의 string을 처리하는 것으로 확인된다.

먼저 3개의 string이 무엇인지 확인하자.


맨 처음 MainActivity로 돌아가면 3개의 string은 아래와 같음을 알 수 있다.

① 사용자의 입력값 ② SecurityKey ③ SecurityIv 


그렇다면 사용자의 입력값은 우리가 정할 수 있는데 2번과 3번은 어디서 얻을 수 있을까?



여기저기 찾아본 결과 setSecurityKey와 setSecurityIv가 있는 getConfig라는 함수를 찾았다.

이것을 보면 Database에서 해당 값을 가져오는 것을 알 수 있다.


DB명을 알기 위해 SEELCT_QUERY를 찾아보면 데이터를 가져오는 db의 이름은 db.db, table 이름은 config 임을 알 수 있다.



astrogrep으로 db.db를 검색한 결과 assets 폴더에 존재함을 확인하였고 DB Browser를 통해 보면 아래와 같은 데이터를 확인할 수 있다.



getConfig() 함수를 통해 SecurityIv는 5번째 열, SecurityKey는 6번째 열임을 확인하였으므로 해당 값들은 아래와 같다. (0부터 시작이므로 5번쨰, 6번째다)

SecurityIv = a5efdbd57b84ca36

SecurityKey = 37eaae0141f1a3adf8a1dee655853714


윽.. 암호화 알아보기 귀찮아서 일단 여기까지!
다음에 또 AES 암호화관련된 문제 있으면 이어서 풀겠다아



출처 : http://hackability.kr/entry/2014SUCTF-Reverse-200-Commercial-Application

반응형
블로그 이미지

rootable

,
반응형

IOS 버전 10.3 이전의 경우 burp 인증서를 설치하면 알아서 신뢰까지 해준다.


But 10.3 이후는 수동으로 설치한 인증서일 경우 직접 신뢰를 해주어야한다.


[ 설정 > 일반 > 정보 > 인증서 신뢰 설정 ] 에서 진행하시면 됩니다~


참고 : 

https://support.apple.com/ko-kr/HT204477

https://support.portswigger.net/customer/en/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device

반응형
블로그 이미지

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

,