Wargame/LOS

    [LOS] frankenstein 풀이 (st.28)

    풀이 hex로만 삽질하다가, Limelee님 풀이를 참고했습니다. URL: https://blog.limelee.xyz/ Limelee blog.limelee.xyz 이번 문제는 Error Based + Blind SQLi이다. preg_match 함수가 괄호와 union을 모두 거르니, 괄호가 필요없는 case문과 hex값으로 접근을 시도해야한다. 먼저 case문에 대해 설명해보겠다. CASE (비교 컬럼), WHEN 비교식, THEN 참일 경우, ELSE 아닐 경우. END 이 형태로 이루어져있다. if문 사용하듯이 사용하면 될 것 같다. 이제, Query문에서 error가 발생하면 페이지에 error가 출력된다는 점을 노려 Query문을 작성해보자. Query: ?pw=1' or id=0x61646..

    [LOS] phantom 풀이 (st.29)

    풀이 문제를 풀기 앞서, 풀이에 사용한 Query문이 정말정말정말 길다.. 이번 문제는 코드 해석이 중요한 문제라고 생각한다. 코드를 보면, GET 방식으로 joinmail과 email 변수를 받는데, email에는 addslashes 함수가 적용되어 있어, 우회는 어려울 것으로 예상된다. 문제를 풀어보면 table을 시각화해주는 표가 주어진다. 표에 안 보이는 no값을 제외한 값, ip, email 값이 보인다. 이번 문제는 삽질도 정말 많이 하면서, SQL Query 문법을 공부하는데 정말 많은 도움이 된 문제이다. 먼저 다음 코드를 봐보도록 하자. $query = "insert into prob_phantom values(0,'{$_SERVER[REMOTE_ADDR]}','{$_GET[joinmai..

    [LOS] blue_dragon 풀이 (st.27)

    풀이 이번 문제는 id, pw 모두 싱글 쿼터와 이스케이프 문자(\)를 Filtering 한다. 이렇게만 보면 정말 답이 없어 보이는 문제이다. 그러나, 코드를 자세히 보면, query를 보내고, preg_match 함수가 실행된다. 즉, Time Based SQLi를 사용할 수 있다는 것이다. Time Based SQLi를 간단하게 설명해보겠다. MySQL에는 sleep이라는 쿼리를 의도적으로 멈춰주는 함수가 존재한다. 예를 들어보자면 ?id=admin' or sleep(1)%23 이라는 쿼리를 보내면 1초 후 쿼리가 보내진다. 그렇다면 이런 쿼리를 보내보면 어떨까? Query: ?id=admin&pw=1' or if(length(pw)>4, sleep(3), 1)%23 pw의 길이가 4 초과라면 sl..

    [LOS] red_dragon 풀이 (st.26)

    풀이 이번 문제는 id의 최대 길이가 7자이다. 또한 no는 is_numeric 함수를 통과 해야한다. 이번 문제는 result['no'] === GET['no'] 분기문을 보면 알 수 있듯이, no의 값을 맞춰야한다. id부분 Query를 다음과 같이 바꾸면 어떻게 될까? Query: ?id='||1%23 $query = "select id from prob_red_dragon where id=''||1#' and no={$no}"; 해당 부분이 주석처리 된다. #을 넣으면 한 줄 주석 처리가 된다는 점을 이용해 no의 값을 추측해보자. Query를 다음과 같이 바꿔보자. Query: ?id='||pw>%23&pw=%0a(숫자) $query = "select id from prob_red_dragon ..

    [LOS] hell_fire 풀이 (st.23)

    풀이 rootable님의 설명을 듣고 오시는 걸 추천합니다. URL: https://rootable.tistory.com/entry/LOS-hellfire-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4 [LOS] hell_fire 문제 풀이 해당 문제는 order by 절에서의 SQL Injection 문제이다. 해당 문제는 이전에 공부한 적이 있어 비슷한 방식으로 접근하였다. 예전에 공부한 문서는 아래의 네오이즘 님의 블로그를 보았었다. https://n30 rootable.tistory.com 비슷한 방법으로 풀었기에, 풀이에 사용한 코드만 올리겠습니다.

    [LOS] evil_wizard 풀이 (st.24)

    풀이 문제에서 hell_fire와 진짜로 같냐고 물어보는데, 나는 그냥 똑같은 방법으로 풀렸다. 풀이에 사용한 코드는 다음과 같다.

    [LOS] green_dragon 풀이 (st.25)

    풀이 지금까지 풀었던 문제 중 제일 오래 걸린 문제다. 테스트 해보려고 내가 서버에 MySQL을 깔 줄이야 ㅠ.ㅠ 이 문제는 좀 특별한 게, Query를 총 2번 날린다. 그래서 그런지, query2가 정상적으로 동작하기 위해서는, 생각보다 좀 코드를 많이 꼬아야 한다. 이 문제는 result['id'] 값이 admin이면 해결되는 간단한 문제처럼 보인다. 이제 풀이를 봐보자. 우선 싱글, 더블 쿼터를 Filtering 하니, 이스케이프 문자(\)를 이용해 필터를 우회하자. 먼저 union select를 통해 query2가 실행되게 만들어보자. id, pw로 컬럼이 총 2개이니 union select 1,2를 넣어보면 query2가 나오지 않을까 싶다. Query: ?id=\&pw= union selec..

    [LOS] dark eyes 풀이 (st.22)

    풀이 이번 문제는 전 문제와 똑같은 Error Based SQLi지만, if문이 Filtering 규칙에 포함이 되어있다. 이번에는 if없이 union select으로만, 값을 얻어내자. pw의 길이를 알아내는 방법은 다음과 같다. 마찬가지로, 부등호를 이용하면 pw의 길이를 구할 수 있다. Query: ?pw=1' or id='admin' and (select 1 union select (length(pw)=8))%23 오류가 안나는 것을 보아하니, pw의 길이는 8이 확실하다. 이제 파이썬을 이용해 pw의 값을 알아내자. 코드는 다음과 같다. 역시 대소문자에 유의하자.