본문 바로가기
CSE/네트워크 및 웹보안

[웹보안] SQL Injection Attack

by 잔디🌿 2025. 6. 2.

    SQL Injection Attack

    sql 로그인

    -p 다음에 비번 입력

    DB 만들기

    show database 하면 원래 데이터베이스 보여야함

    없으니까 create database로 만든다.

    그 다음 해당 데이터베이스에 접속하고, 테이블을 만든다.

    DESCRIBE문으로 테이블의 기본 정보를 확인할 수 있다.

    INSERT INTO 문으로 요소들을 넣을 수 있따.

    이떄 id는 자동생성되므로 우리가 따로 만질 필요는 없다.

    select 문으로 테이블 요소들을 확인할 수 있다.

    where 절

    where절에 있는 문이 true인 요소들만 반영한다.

    and나 or을 쓸 수 있다

    위와 같이 항상 참인 것을 넣을 경우, 모든 요소가 해당되어 출력되게 된다.

    위의 where 절을 활용해서 원하는 요소의 정보를 수정할수도 있다.

    <주석>

    한 줄을 주석처리하려면 #나 —를 사용하면 되고,

    /**/로 여려줄을 주석처리할 수 있다.

    sql injection은 데이터베이스에 데미지를 준다.

    Data가 반영되는 과정

    사용자가 정보를 입력함

    이런식으로 form에 들어가고

    이렇게 요청이 간다.

    ?다음에 파라미터가 들어가고, 각 파라미터는 이름 = 값 형태이면 &로 구별된다.

    https면 이것들이 암호화된다.

    그러면 서버는 위와 같은 방식으로 http 요청에서 데이터를 꺼내온다.

    그 다음 데이터베이스에 연결하고

    이렇게 쿼리문을 만들어서 데이터베이스에 반영한다.

    SQL Injection

    유저가 제공하는 데이터로 sql statement를 변경할 수 있다.

    여기서 유저의 아이디만을 안다고 가정했을 때

    이렇게 아이디를 입력하고 뒤에 주석처리를 하면 비밀번호를 아무거나 입력해도 로그인이 가능하게된다.

    만약 아이디도 모르고 모든 사용자의 정보를 빼내고 싶으면

    이렇게 항상 참인 식을 where절에 넣으면 된다.

    cURL 사용 공격

    커멘드라인에서 http 요청을 보낼 수 있는 도구이다.

    http 요청에서는 특수문자 인코딩 처리를 해서 보내야한다.

    따라서 위와 같이 특수문자는 인코딩해서 넣어야한다.

    DB변경

    위처럼 비밀번호 바꾸는 부분이 있다고 하자.

    이 때 salary도 변경하고자 한다.

    그러기 위해서는 저 set 부분에 salary도 변경하는 코드를 추가해야한다.

    이를 위해서 new Password 를 위와 같이 입력한다.

    100000뒤에 #를 붙이는 이유는 원래 passwd 뒤에 들어가는 따옴표를 없애기 위해서다

    또한 이걸로 타인의 salary를 0으로 만들수도 있다

    이렇게 입력하면 된다.

    sql문을 삽입하여 실행하는 것은 매우 위험한데 그 이유는 DROP과 같은 명령어를 입력하면 디비를 아예 삭제할수도 있기 때문이다

    하지만 mysql에서는 이것이 동작하지 않는다.

    그 이유는 mysql은 다중쿼리를 실행하는 것을 허용하지 않기 때문이다

    만약 다중쿼리를 실행하고자 하면 mysql → multi query()를 사용하면 되는데 이건 보안상 매우 위험해서 사용하길 권장되지 않는다.

    이러한 위험이 발생하는 이유는 코드에 데이터가 섞이기 때문이다.

    예방방법

    Filtering and Encoding Data

    특수문자를 필터링하거나 인코딩한다

    또한 real_escape_string 명령어로도 이들을 인코딩할 수 있다.

    Prepared Statement

    코드와 데이터를 분리한다.

    Prepared Statement를 사용할 때, 우리는 일부 값들이 비워진 SQL 문장 템플릿(statement template)을 데이터베이스로 보낸다.

    데이터베이스는 이 템플릿을 파싱하고, 컴파일하고, 쿼리 최적화를 수행하지만, 즉시 실행하지는 않는다.

    이후에 우리는 이 Prepared Statement에 실제 데이터를 바인딩(bind)하여 사용한다.

    원래는 이렇게 취약했던 코드가

    이렇게 변하게 된다.

    왜 이 방법이 안전한가?

    코드는 코드채널로 전송되고, 데이터는 데이터채널로 전송된다. 데이터채널로 받은건 코드화되지 않는다.

    따라서 데이터 내에 숨겨둔 sql은 실행되지 않는다.

    Blind SQL Injection

    어떤 http 응답은 결과를 표시하지 않는다.

    이를 해킹하기 위한 방법들이다.

    Conditional Response

    보낸 쿼리문이 참이면 welcome을 출력하고 아니면 nothing을 출력하는 응답이 있다

    그러면 위와 같이 하나씩 대조해가면서 비밀번호를 추정할 수 있다.

    SQL ERROR

    쿼리문에서 false가 나오면 에러를 발생시키도록 한다.

    또한 오류메세지에서 유의미한 결과를 얻을 수 있다.

    여기서 column이 string이라서 int변환하면 오류가 난다.

    이 때 에러를 발생시키면 데이터가 에러메세지에 드러나게 된다

    Time Delays

    만약 에러가 나면 몇초 딜레이되도록 쿼리문을 짠다. 그러면 시간이 딜레이 되는 것으로 true, false여부를 판단할 수 있다.

    이 떄 a가 z보다 작다

    1. Brief tutorial of SQL
    2. SQL Injection attack and how to launch this type of attacks
    3. The fundament cause of the vulnerability?
    4. How to defend against SQL Injection attacks?
    5. Prepared Statement



    'CSE > 네트워크 및 웹보안' 카테고리의 다른 글

    [웹보안] ClickJacking Attack  (1) 2025.06.02
    [웹보안] Enviroment Variables & Attacks  (0) 2025.06.02
    [웹보안] XSS  (4) 2025.04.28
    [웹보안] CSRF  (0) 2025.04.28
    [웹보안] 네트워크와 웹보안  (0) 2025.04.28