본문 바로가기
728x90

It28

2023 Pico CTF writeup (web/More SQLi) 이번 문제는 진짜 삽질만 엄청 했던 문제다 ㅎㅎ 문제를 보면 이 웹사이트에서 flag를 찾을 수 있냐라고 묻고 있다. 사이트를 들어가 보면 로그인 창이 나온다. 우선 간단한 로그인 우회를 해봤는데 쿼리문이 username이랑 password랑 순서가 바뀌어 있어서 다시 시도해봤다. 어라...? 처음엔 필터링이 걸려있나 했는데 출력되는 걸 보니 필터링은 아닌 것 같고.... 이것저것 바꿔보면서 시도하던 중 혹시 주석이 문젠가 하고 --을 입력해 봤더니 로그인에 성공했다! (이때 알아차렸으면 내 미래가 좀 달라졌을까....) 이제 검색창에 인젝션을 시도해 봐야 되는데 union을 쓰면 될 거 같아 시도해 봤다. 먼저 칼럼수를 알아내기 위해 ' union select 1 --부터 하나하나 늘려갔더니 3까지 입.. 2023. 3. 30.
2023 Pico CTF writeup (web/SOAP) 이번 문제는 XXE문제로 /etc/passwd 파일을 읽을 수 있는지 물어보고 있다. 사이트에 들어가보니 대학,ctf,기업에 대한 설명들과 details 버튼을 누르니 세부 정보가 출력되었다. details를 누른후 세션을 잡아봤더니 xml이 사용된것을 볼 수 있었다. 이라는 간단한 xml 쿼리를 작성한뒤 ID는 외부 엔티티를 참조하도록 &xxe;를 넣어주면 passwd 파일이 출력되는것을 볼 수 있다. 아래에 보면 flag값이 포함되어 있다. 2023. 3. 30.
Lord of SQL Injection 18단계 (nightmare) 이번에 처치할 몬스터는 nightmare! 이번 문제 코드를 보면 이번에는 지금까지 썼던 주석 #이 필터링 되어 있는것이 보인다. 또한 pw의 길이가 6까지 제한되어 있다. 흠흠... 일단 주석에 대해 알아보자. 주석은 4가지 방법이 있는데 1. -- - 뒤에 반드시 공백이 있어야 정상적으로 주석 처리가 된다. - 한 줄만 주석 처리한다. 2. # (url encoding - %23) - 뒤에 공백이 없어도 정상적으로 처리된다. - 한 줄만 주석 처리한다. 3. /* */ - /* */ 사이에 입력시 주석 처리 된다. 4. ;%00 - Null 문자인 %00과 ;이 결합된 주석 처리 문자이다. 이 문제에서 #,-,/ 가 필터링 되었으므로 우리가 사용할 수 있는 주석은 4번이다. 그럼 일단 pw부분을 참으.. 2023. 3. 29.
Lord of SQL Injection 17단계 (zombie assassin) 이번에 처치할 몬스터는 zomble assassin! 코드를 보면 저번 문제와 쿼리문 양식은 같은데 id와 pw를 받는 방법이 다른 것을 볼 수 있다. 두 개의 함수로 받고 있는데 strrev와 addslashes이다. addslashes 함수는 데이터베이스의 질의에서 처리할 필요가 있는 문자(싱글쿼터, 더블쿼터, 역슬래쉬, Null Byte) 앞에 백슬래시(\)를 붙여 문자열로 반환한다. 예를 들어 I'm Jhon 이라는 쿼리를 전송하면 싱글쿼터가 포함되어 있어 쿼리문에 오류가 발생할 수 있다. 이를 방지하기 위해 I\'m Jhon으로 쿼리문을 바꿔준다. (백슬래쉬 뒤에 특수문자는 문자로 취급한다는 것은 이전 문제에서 다뤘다.) strrev 함수는 받은 문자열의 순서를 반대로 바꿔준다. 예를 들어 ap.. 2023. 3. 28.
Lord of SQL Injection 16단계 (succubus) 이번에 처치할 몬스터는 succubus! 이번 코드를 보면 id와 pw인자를 받고 싱글쿼터(')는 둘 다 필터링되어 있다. 이걸 보고 딱 떠올린게 지난 문제에서 싱글쿼터(')가 필터링되어 있던 문제가 있어 우회법을 알아본 게 기억이 났다. 이번에 쓸 우회법은 지금처럼 인자 두개를 받는 특수한 경우에만 쓸 수 있다. 역슬래쉬(\) 뒤에 싱글쿼터(')가 있는 경우 싱글쿼터는 문자 취급을 받는다. 즉, ?id=\&pw=or id="admin"%23을 입력하면 id='\' and pw=' or id="admin"#'가 출력되는데 id='\' and pw=' or id="admin"#' 여기서 \'가 문자로 취급되기 때문에 빨간 부분이 id값으로 들어가게 되고 뒤에 id값을 넣어줘 참을 만들어 주면 문제가 풀릴것.. 2023. 3. 28.
Lord of SQL Injection 15단계 (assassin) 이번에 처치할 몬스터는 assassin! 이번 코드를 보면 보기엔 너무 간단해 보였다. 딱 보자마자 id를 admin으로 바꿔주면 되는 거 아닌가 했는데 싱글쿼터(')가 필터링되어 있어서 어떻게 해야 되나 한참 고민했다. 지난 문제들처럼 no 인수값을 받는 것도 아니고... id를 바꿀 수는 없는 거 같아 admin에 해당하는 pw값을 직접 찾아봐야 될 것 같다. 그래서 생각해 본 게 문제에서 괜히 =을 안 쓰고 like를 쓴 이유가 있지 않을까 해서 like에 대해 검색을 해봤다. 따란~ 와일드카드 문자가 있었다 와일드카드는 옛날에 리눅스 터미널 쓸 때 경험해 봤다. 간단하게 설명하면 예를 들어 "s"로 시작하는 모든 이름을 검색하려면 "s%"를 입력하면 되고 이름의 길이와 해당 문자들을 알면 "s_n.. 2023. 3. 27.
Lord of SQL Injection 14단계 (giant) 이번에 처치할 몬스터는 giant! 코드를 보면 어라... 지금까지 풀어왔던 문제들과는 다른 유형의 문제로 처음 봤을 때 많이 당황했다. 일단 필터링은 공백( )에 관한 문자들만 되어있는것을 보면 이 문제는 공백을 넣어야 되는 문제인 것을 유추할 수 있었다. 그래서 계속 봤더니 from과 prob_giant가 붙어있으며 shit속성을 받아 그 사이에 공백을 추가해야 되는 문제인 것을 알아챘다.(from과 prob_giant 즉 쿼리문과 데이터베이스 이름이 공백 없이 붙어있어 정상적인 작동이 되지 않았던 것) 바로 공백 문자를 우회해서 넣어보자 공백 우회에 대해서는 https://jh-hack.tistory.com/18 여기서 다뤘으니 참고하길 바란다. 2023. 3. 17.
Lord of SQL Injection 13단계 (bugbear) 이번에 처치할 몬스터는 bugbear! 코드를 보면 이번 문제도 어김없이 pw값을 알아내는 문제이다. 이번에 중요한 필터링은 싱글쿼터('), substr, ascii,=,or, and, like, 0x, 공백( )이 필터링되어 있다. 일단 =의 우회방법은 =도 필터링되었으니 저번에 알아봤던 =의 다른 우회방법들을 섞어서 써보겠다.(생각이 안난다면 아래 링크를 클릭) https://jh-hack.tistory.com/24?category=1091406 Lord of SQL Injection 11단계 (golem) 이번에 처지할 몬스터는 golem! 이번 코드를 봐보면 핵심인 내용은 and와 or 뿐 아니라 등호(=), 우리가 비밀번호를 찾을 때 사용했던 substr함수도 필터링되어 있는 것을 알 수 있다... 2023. 3. 17.
Lord of SQL Injection 12단계 (darkknight) 이번에 처치할 몬스터는 darkknight! 코드를 봐보자~ 우선 문제는 여러 번 풀어본 blind sql injection으로 비밀번호를 알아내는 문제 같고 여기서 신경써야될 필터링은 싱글쿼터('), substr, ascii가 있다. 먼저 우리는 항상 pw값을 입력할때 pw부분이 싱글쿼터(')로 묶여있어 싱글쿼터(')를 이용하여 닫아준 후 뒤에 쿼리문을 집어넣었는데 싱글쿼터가 필터링되어 있어 뒤에 있는 no 값에 넣는게 편하다고 생각이 들었다. 생각을 토대로 no값에 쿼리문을 넣어 pw의 길이를 알아낸 결과 어김없이 8이었다. 이제 substr이 필터링 되어 있으니까 left() 함수를 사용해 보자. 쿼리문이 잘 작동하는 것을 확인한 후 마지막 자리까지 알아보면 pw가 0b70ea1f인 것을 알 수 있.. 2023. 3. 16.
Lord of SQL Injection 11단계 (golem) 이번에 처지할 몬스터는 golem! 이번 코드를 봐보면 핵심인 내용은 and와 or 뿐 아니라 등호(=), 우리가 비밀번호를 찾을 때 사용했던 substr함수도 필터링되어 있는 것을 알 수 있다. 등호(=)의 우회법은 여러가진데 1. like - 사용하는 법은 =와 같다. ex) or 1 like 1 2. in - =대신 사용하며 뒤에 ()을 붙인다. ex) or id = ("admin") 3. instr - instr 함수로 instr(id, "admin") 같이 사용한다. 4. - 부등호로 범위를 줄여가며 추측할 수 있다. ex) length(pw) > 7 이 참이고 < 9 도 참이면 length(pw)는 8. 이 문제에서 사용할 방법은 like이다. 먼저 pw의 길이를 알아내보자. 지금까지 계속 8.. 2023. 3. 15.
728x90