2010-11-23 8 views
4

저는 SQL 주입 공격에 대해 자세히 알아 내려고 노력했습니다. 나는이 원리를 이해하고 있지만 실제로 이러한 공격의 일부를 볼 때 그들이하는 일을 어떻게하는지 알지 못합니다.SQL 인젝션 공격에 이상한 서식이 있습니까?

불규칙한 따옴표가있는 것처럼 보이며 16 진수 문자를 통해 많은 난독 화가있는 것 같습니다.

나는 16 진수 문자를 얻지 못한다 ... 확실히 브라우저로 ASCII 문자로 다시 변환된다. 그래서 요점은 무엇인가?

그러나, 나는 주로 인용 홀수에 의해 혼란 스러워요. 지금 예를 찾는 데 어려움을 겪고 있습니다 만, 일반적으로 성명서가 끝나기 전에 어느 시점에서 인용문이 끝나는 것처럼 보입니다.

아마도 예는 '1 또는 1 = 이러한 문이 무엇을하고 1

의 일반적인 용도는 무엇입니까?

+0

좋은 질문입니다. 슬프게도 나는 SQL 인젝션 익스플로잇에서이 기술을 실제로 사용했다는 것을 알았습니다. – rook

답변

2

나는 ... 16 진수 문자를 얻을하지 않습니다 확실히 그들은 브라우저

아니에 의해 다시 ASCII로 변환됩니다.

그러나 나는 주로 이상한 인용문으로 혼동합니다. 나는 지금 예를 찾는 데 문제 가 오전 그러나 보통 문이 끝나기 전에 어떤 점에서 인용 의지 끝, 때 그것이 끝이 될 것이라고 생각했을 것 같다?

매개 변수 대체를 사용하는 대신 인라인 SQL을 작성한다고 가정 해보십시오. 특별한 이유없이 PHP와 매우 흡사 한 make-believe 언어를 사용할 것입니다.

$sql = "delete from foo where bar = '" + $param + "'"; 

그래서 지금,
$param = "' or 1=1 --" 

는 (우리는 -- 여기에 SQL 주석 순서입니다 같은 척하고 ... $param이 같은 브라우저에 의해 설정됩니다 것을 상상한다.이 방법을 거기 아니에요 경우 그 주위도)

이제, 문자열 대체가 끝나면 SQL은 무엇입니까?

delete from foo where bar = '' or 1=1 --' 

foo의 모든 레코드가 삭제됩니다.

이것은 의도적으로 간단하지만 불균등 한 따옴표가 무엇인지에 대한 좋은 아이디어를 제공합니다.

+1

@Rook - 대부분의 대답은 16 진수 인코딩과 관련이 없습니다. 방금 브라우저에 대한 가정을 정정하고 계속 전진했습니다. 또한, 나는 그의 질문이 mysql에 어떻게 특정한 것인지 알지 못한다. 그래서 mysql_query에 대한 논쟁은 상당히 가짜 다. – Donnie

+0

이것은 질문에 대답하지 않습니다. 내가 게시 한 SQL injection exploits 중 하나를 읽어야합니다. – rook

2

이름 필드가있는 양식을 제출하는 양식이 있다고 가정 해 보겠습니다. name이 $ Name 변수에 사용되었습니다.

INSERT INTO Students VALUES ('$Name') 

이것은로 번역됩니다 : - 주석 구분 기호가

INSERT INTO Students VALUES ('Robert'); DROP TABLE STUDENTS; --') 

당신은이 쿼리를 실행합니다. 그 후에 모든 것은 무시 될 것입니다. '은 문자열 리터럴을 구분하는 데 사용됩니다.

공격에 16 진수 문자를 사용하려면 몇 가지 이유가 있습니다. 하나는 난독 화이고, 다른 하나는 순진한 보안 대책을 우회하는 것입니다.

+0

일괄 처리 된 쿼리는 현재 유비쿼터스 SQL 서버에서 지원되지 않습니다. 또한 - 단 한 개의 주석 구분 기호가 아닙니다. MySQL은/​​* ... 그리고 16 진수 인코딩을 사용하는 것은 당신이 실제 쿼리를 숨길 수 없기 때문에 난독 화를 위해 매우 드물게 사용됩니다. 그것은 주로 hexed 값 주위에 작은 따옴표가 필요하지 않기 때문에 주로 사용됩니다. 따라서 복잡한 injection을 할 때 따옴표의 수를 걱정할 필요가 없습니다. 주입 쿼리의 전체 로직을 처리하십시오 –

+0

이것은입니다. SQL 주입의 SQL Server 예제입니다. 이것은'mysq_query()'와는 결코 작동하지 않을 것이고 16 진 인코딩을 다루지는 않을 것이다. – rook

+1

XKCD 참조 +1 : http://xkcd.com/327/ –

1

불균등 한 따옴표에 관해서는; 고려 문

SELECT * FROM admin WHERE username='$_GET["user"]' and password='$_GET["pass"]' 

다음 나는 유효한 사용자가 '관리자'는 것을 알고 있다면 내가

다음가는, 'or 1=1를 삽입 - 코더는 작은 따옴표와 같은 위험한 문자에 대한 사용자 입력을 소독하지 않은 경우 SQL 주입이 발생합니다
SELECT * FROM admin WHERE username='admin' and password='something' or 1=1 

이렇게하면 암호 값에 관계없이 식의 왼쪽이 항상 참이므로 쿼리를 항상 반환하게됩니다.

은 SQL 주입의 가장 간단한 예를 들어, 당신은 공격자가 같은 -- 또는 /* 구분 코멘트와 함께 쿼리의 나머지 부분을 전혀 따옴표를 사용하거나 어쩌면 언급 할 필요가 없습니다 것을 발견 할 것이다 ofter , 주입 지점 이후에 더 많은 매개 변수가 전달 된 경우.

16 진수 인코딩의 경우 필터링을 피할 수있는 몇 가지 이유가있을 수 있습니다. 쿼리에서 모든 값을 인용 할 필요가 없으므로 16 진수로 인코딩 된 값을 사용하는 것이 간단합니다. , 3 행을 제공하는 것입니다

inject.php?id=1 and 1=0 union select 1,2,concat(username,0x3a3a,password) from admin 

표시 하나입니다 isntance admin::admin에 대한 반환 : 당신과 같이 두 개의 필드 함께-표기하기 공동 concat을 사용하려는 경우 이것은 예를 유용입니다. 나는 진수 인코딩을 사용하지 않은 경우, 나는이 작업을 수행해야합니다 :

inject.php?id=1 and 1=0 union select 1,2,concat(username,'::',password) from admin 

이 상기 addslashes 기능에 문제가 될 수 있지만, 당신은 매우 복잡한 쿼리가있는 경우도와 제대로 정규식 위생 기능을 서면 또는 수 있습니다.

SQL 주입은 매우 광범위한 주제이며, 소개 한 내용은 거의 소개하지 않습니다.

+0

이것은 질문에 답하지 않습니다. – rook

+0

@Rook. 그것은 16 진수로 당신에게 깊숙이 들어가진 않았지만 당신이 한 것보다 더 많은 질문에 답했습니다. 나는 그가 한 가지 주제뿐만 아니라 모든 질문을 통과했다는 것을 의미한다. –

+0

만화책에서 찢어진 @ VP의 답변과 달리 괜찮은 공격 시나리오입니다. 그리고 그것은 내 것과 거의 동일합니다. 그러나 나는 여전히'load_file()'과'into outfile'이 더 유용한 예제라고 생각합니다. – rook

2

SQL 인젝션에서는 따옴표를 사용할 수없는 경우가 있습니다. 이 경우 공격자는 문자열에 16 진수 인코딩과 같은 인코딩 방법을 사용해야합니다. 예를 들어 '/etc/passwd'은 따옴표가 필요하지 않은 0x2f6574632f706173737764으로 작성할 수 있습니다. 다음은 따옴표가 금지 된 취약한 쿼리의 예입니다. : 당신이 load_file() 같은 MySQL의 기능을 사용하려면

mysql_query("select name from users where id=".addslashes($_GET[id]));

는, 당신은 진수 인코딩을 사용합니다.

이의 PoC :이 경우/etc/passwd에에서 /vuln.php?id=1 union select load_file(0x2f6574632f706173737764)

읽기되고 있으며, 2 행이 될 것입니다.

function charEncode($string){ 
    $char="char("; 
    $size=strlen($string); 
    for($x=0;$x<$size;$x++){ 
     $char.=ord($string[$x]).","; 
    } 
    $char[strlen($char)-1]=")%00"; 
    return $char; 
} 

내가 exploiting HLStats 1.35이 정확한 방법을 사용하십시오 여기

내가 내 MySQL의 SQL 인젝션 공격에서 사용하는 진수 인코딩 기능의 변형이다. 나는 을 사용하여 디스크에 <?php?>을 쓰는 xss 필터를 우회하려면 내 php nuke exploit에서이 함수를 사용했습니다. into outfile은 함수 또는 16 진수로 인코딩 된 문자열에 대한 출력을 허용하지 않는 쿼리 연산자이므로 인용 된 문자열 만 경로로 허용하므로 위의 취약한 쿼리에서 into outfile은 공격자가 사용할 수 없습니다. where로는 load_file()이 함수 호출이고 16 진수 인코딩을 사용할 수 있습니다.

+0

Excellent 대답. 궁금 해서요. 왜 MySQL은'0x2f6574632f706173737764'를'/ etc/passwd'로 해석합니까? –

+0

@Vincent Savard 0x는 많은 언어에서 구문의 일부입니다. PHP는이 값을 숫자로 해석합니다. MySQL은 ascii 문자열을 보는데 2f는'/'이고 65는'e' 문자이고 74는't'이다.등등. – rook

+0

@Rook : 예, 0x에 대해 알고 있었지만 문자열로 해석되어 놀랐습니다 (PostgreSQL은 숫자로 해석하고 모든 언어도 마찬가지입니다). 정밀도에 감사드립니다. –

관련 문제