본문 바로가기

전체 글

(157)
SQLi 정리 서버 측 공격 (피해자 : 서버)1. SQLi 포인트SQL 질의문을 사용하는 곳서버에 넘어가는 파라미터(데이터) 확인서버 측 SQL 질의 추론 후 공격하기2. UNION SQLiSQL 질의 결과(데이터)가 화면에 출력되는 경우3. Error Based SQLi로직 SQL 에러 메시지가 출력되는 경우 (문법 에러 X)4. Blind SQLiSQLi 동작하는 모든 경우5. SQLi 대응 방안5.1. Prepared Statement사용자의 입력을 받는 부분을 제외하고,나머지 쿼리문을 미리 기계어로 컴파일해 둔 뒤,사용자의 입력 값을 SQL 문법이 아닌 문자 그대로 적용해서 SQL 질의를 실행하는 방법 (쿼리 구조 자체를 변경할 수 없고, 사용자 입력 값은 DB 언어가 아닌 문자 그대로 해석된다)5.2. Pr..
SQL Injection Point 4 문제 페이지에 접속해 회원가입을 해보니마이페이지와 게시판 기능이 있는 사이트인 것으로 확인된다.마이페이지에 접속해 보니,Cookie 값에 사용자 ID가 넘어가는 것을 볼 수 있었다.해당 쿠키 값이 DB에 SQL 질의하는지 알아보기 위해user' and '1' = '1항등원 쿼리를 넣어보았다.결과를 보니쿠키 값에서 전달되는 사용자의 ID 값으로는참과 거짓의 결과가 같기 때문에 SQLi 할 수 있는지 아직은 모르겠다.이후 SQL 에러를 유도해 봤을 때,DB Error 라는 문구가 출력된다.select () from () where userid='user' and (select 1 union select 2 where (1=1)) and '1' = '1이번엔 union 구문을 사용하여 에러를 유도해보니,uni..
SQL Injection Point 3 문제 페이지에 접속해 회원가입을 해보니마이페이지와 게시판 기능이 있는 사이트인 것으로 확인된다.게시판에 들어가 보니게시글을 검색하는 칸을 볼 수 있다.제목을 기준으로 t라는 문자를 검색해 보니작성해 둔 test 게시글이 가져와진 것을 볼 수 있다.게시글 검색 HTTP 요청 패킷을 확인해 보니검색 조건인 제목을 전달하는 option_val 파라미터와검색 내용인 't'를 전달하는 board_result 파라미터,정렬을 담당하는 sort 파라미터를 볼 수 있다.board_result 파라미터에는 SQLi 공격이 불가능해 보인다. (prepared statement 사용 예상)option_val 파라미터에는 Blind SQLi 공격이 가능해 보인다. (조건의 참 거짓 판별 가능)sort 파라미터의 경우 컬럼 인..
SQL Injection Point 2 문제 페이지에 접속해 회원가입을 해보니마이페이지와 게시판 기능이 있는 사이트인 것으로 확인된다.게시판에 들어가 보니게시글을 검색하는 칸을 볼 수 있다.제목을 기준으로 t라는 문자를 검색해 보니작성해 둔 test 게시글이 가져와진 것을 볼 수 있다.select () from () where title like '%t%'위와 같이 SQL 질의문을 예상할 수 있다.HTTP 요청 패킷을 확인해 보니검색 조건인 제목을 전달하는 option_val 파라미터와검색 내용인 't'를 전달하는 board_result 파라미터를 볼 수 있다.select () from () where title like '%t%' and '1%' = '1%'board_result 파라미터에 항등원 쿼리를 입력했을 때,게시글이 가져와지지 않는..
SQL Injection Point 1 문제 페이지에 접속해 회원가입을 해보니마이페이지와 게시판 기능이 있는 사이트인 것으로 확인된다.마이페이지에 들어가 보니사용자 ID, 사용자 정보를 출력해 주는 칸과변경할 비밀번호를 입력하는 칸이 있었다.HTTP 요청 패킷을 확인해 보니파라미터는 각각 id, info, pw를 사용하고 있었고SQLi 포인트 테스트 시, 별다른 리턴을 얻을 수 없었다.하지만 클라이언트가 전달하는 쿠키 값에 사용자 ID가 전달되는 것을 볼 수 있었고,쿠키 값을 admin으로 변조해서 요청을 보내보니,사용자 ID가 쿠키 값으로 출력된다는 사실과쿠키 값이 올바르지 않다면 사용자 정보가 출력되지 않는다는 사실을 알 수 있었다.True_code = "Nothing Here"apple' and (Blind_SQLi_Format) and..
SQLi 대응 방법 1. Prepared Statement# 입력 받을 준비select * from member where id=''# 사용자 입력user' and '1' = '1# 입력 받은 값 컴파일select * from member where id='user' and '1' = '1'ㄴ> 01010101001010101010101010101010101# 실행01010101001010101010101010101010101# SQLi 발생!# SQL 쿼리문 구조 바뀜사용자의 값을 입력받으면SQL 질의문 (위의 예시에서는 select 구문) 전체를 사용자에게 전달받은 값과 함께 기계어로 컴파일한다.이 때문에 SQL 인젝션이 발생했다.# 사용자 입력 부분 제외 미리 컴파일01010101010101010101 사용자 입력 값..
SQLi 포인트 1. HTTP 요청 헤더해당 마이페이지는로그인한 사용자의 ID를 불러올 때,서버 내부에서 세션을 이용해 ID를 가져오는 것이 아닌클라이언트의 쿠키 정보로 select 구문을 동작시켜 DB에 정보를 가져오는 로직이다.즉, 사용자의 post 입력 값, get 파라미터 이외에도HTTP 헤더 정보인 쿠키, 혹은 유저 에이전트 값 등을 받아서 SQL 질의를 하는 로직이 있는지 잘 살펴봐야 한다.클라이언트가 서버에 보내는 데이터 중,서버가 그 데이터를 이용해서 DB에 SQL 질의를 하고 있는지 체크한다.해당 쿠키 값에 SQLi 질의문이 동작하는지 항등원 쿼리를 넣어 테스트했다.Nothing Here...라는 사용자 정보가 가져와져 출력된다.항등원 쿼리에서 일부러 거짓 값이 반환되도록 설정하니select 구문의 wh..
old - 54 문제 접속 시,Flag로 보이는 문자열들이 빠르게 지나가는 것을 볼 수 있었다.요청 응답 히스토리를 살펴보니m이라는 매개변수를 통해Flag 문자열 값이 하나 씩응답되고 있는 것을 볼 수 있다.해당 응답 모두 확인해서 문자열을 합쳐보니FLAG{a7981201c48d0ece288afd01ca43c55b}Flag를 얻을 수 있었다.더보기페이지 소스코드를 살펴보니function answer(i){ x.open('GET','?m='+i,false); x.send(null); aview.innerHTML=x.responseText; i++; if(x.responseText) setTimeout("answer("+i+")",20); if(x.responseText=="") aview.innerHTML="?..