Hacking Websites with SQL Injection – Computerphile

실제로 어떻게 발음해야하는지에 대한 논쟁이있었습니다 나는 그것을 후속 주사라고 부른다

약어는 SQL입니다 어느 쪽이든 당신이 그것을 부르면, 그것은 웹 사이트를 공격하는 방법입니다 정말 더 이상 작동하지 않아야하지만 여전히 그렇습니다 Sequel 또는 SQL은 데이터베이스와 대화하는 언어로, 그리고 그것은 상당히 그것은 실제로 영어와 상당히 비슷합니다 당신은 실제로 같은 말을 할 수 있습니다, "이 표에서 선택하십시오" 복잡한 언어가 아닙니다 중괄호와 세미콜론 등의 큰 금액은 없습니다

그것은 될 수 있습니다 그러나 똑같이 거의 영어로 명령을 입력 할 수 있습니다 데이터베이스에서 결과를 얻을 수 있습니다 그리고 이것은 수년과 수년 동안 존재 해왔다 그리고 웹이 올 때까지 그것은 괜찮 았습니다

지금 사람들은 웹 사이트를보고 있으며 생각하고 있습니다 "이것들은 데이터베이스에 연결되어야합니다" Tim Berners-Lee가 World Wide Web을 발명했을 때, 그것은 꽤 많이 "나는 문서를 요청할거야 그 문서를 나에게 돌려 보낼거야 " 결국 사람들은 그것을 해결했습니다

당신이 정말로하고 싶은 것은 문서를 보내는 것입니다 당신이 보낸 것에 따라 다른 것들이 돌아옵니다 어쩌면 검색 요청을 입력 할 수 있습니다 그리고 그것은 데이터베이스에 가서 어떤 것을 되돌릴 것입니다 멋지네요, 훌륭합니다

훌륭한 발명품입니다 불행히도 일부 프로그래밍 언어는이를 합리적인 방법으로 처리했습니다 일부는 그렇지 않았습니다 그리고 가장 유명한 언어 중 하나는 PHP라고하는 언어입니다 저는 PHP 코더입니다

글을 쓸 수있는 아주 쉬운 언어입니다 친절한 언어입니다 나는 여전히 코드를 개발할 수있는 다른 언어를 만난 적이 없다 내가 할 수있는 속도로 그것은 매우 내결함성이 있습니다

합리적으로 항상 최선의 결과를주는 것은 아니지만, 알다시피, 친근하고, 결정적이며 결정적입니다 당신은 텍스트 파일에 그것을 쓰거나 웹 서버에 업로드 할 수 있습니다 (세계 대부분) 그것은 효과가있을 것입니다 PHP 코드를 입력하여 실행하면됩니다

그래서 진입 장벽은 정말로 낮습니다 어느 쪽이 영리한 지 웹 프로그래밍을 훨씬 더 쉽게 이용할 수있게 해줍니다 Facebook은 원래 PHP로 작성되었습니다 무수한 것들은 원래 PHP로 작성되었으며 많은 것들이 여전히 있습니다

워드 프레스는 여전히 있습니다 문제는 조심하지 않으면 잘못 될 수있는 방법이 많다는 것입니다 그리고 이것은 PHP 만있는 것이 아닙니다 예제로 사용하겠습니다 이와 같은 명령을 실행하여 데이터베이스와 대화합니다

SELECT * FROM 사용자 사용자 이름이 같은 위치 "남자 이름" 큰! 그리고 데이터베이스는 "tom"이라는 사용자에 대해 알고있는 모든 세부 정보를 다시 보냅니다 훌륭한! 그러나 캐치는 그 따옴표입니다 내가 보내는 것을 조심하지 않으면, 그러면 우리는 몇 가지 문제를 일으킬 수 있습니다 예를 들어, 로그인 할 수있는 웹 양식이 있고 톰을 입력한다고 가정 해 봅시다 그것을 보내고 "톰"을 다시 가져옵니다

승인? 이제 톰에 따옴표를 넣고 타이핑 해 봅시다 주의를 기울이지 않으면 언어가 이런 식으로 보낼 것입니다 SELECT * 사용자로부터 사용자 이름 같음 "톰"다음에 따옴표를 넣은 다음 따옴표를 넣습니다 따옴표가 일치하지 않아 실패합니다 그리고 모든 것이 충돌하고 단지 오류를 되돌려 보냅니다

그것은 약간 성가시다 물론 큰 문제는 따옴표가있는 텍스트를 넣는 것입니다 캐치는 그렇게 많은 피해를 줄 수 있다는 것입니다 그 언어는 단지 SELECT를 가지고 있지 않기 때문입니다 새로운 물건을 추가하려면 INSERT가 있어야합니다

그것은 물건을 변경하려면 업데이 트했습니다 그리고 물건을 지우기 위해 DELETE가 있습니다 그래서 제가 보내려한다면, 말하자면, '톰'인 사용자 이름; ', 거기에 또 다른 명령을 넣으십시오 '모든 것을 삭제하십시오' 그 문자 그대로의 명령이 아니라 그와 비슷한 것입니다

그것은 효과가있을 것이다 그래서 우리는 어떻게 작동하는지 살펴 봅니다 우리는 정상적인 명령을 가지고 있습니다 "SELECT * FROM users 어디에서 username [mumbles] 'tom' "" 거기에 긴 명령 하지만 네가 '톰'을 넣을 때, 나는 그것을 보낼거야

그리고 나서 이걸 보낼거야 모든 데이터베이스를 삭제하십시오 Enter를 누르면 일반 영어 명령으로 변환됩니다 SQL 언어로, 그것은 보내질 것이다, 데이터베이스가 갈 것입니다 "그게 내가해야할 일이야

" 세미 콜론에 새로운 명령이 있고 모든 것을 삭제해야한다는 것을 이해할 것입니다 주변의 주된 길은 벗어나고 있습니다 따옴표와 같은 위험한 문자가있을 때, 너는 그 앞에 슬래시를 넣는다 그리고 '당신'은 프로그래머가 이것을 쓰는 것을 의미합니다 당신은 통과하고, 당신은 말한 함수를 사용합니다, "어디에서나 따옴표가 있습니다

앞에 슬래시를 넣으십시오 그리고 데이터베이스에 보내기 전에, 그렇게하십시오 " 사용자로부터 입력이 들어오고, 안전을 위해 슬래시를 추가하십시오 그것을 데이터베이스로 보냅니다 그리고 데이터베이스는 그 슬래시를보고 간다

"맞아요, 그 중 하나가있을 때마다, 다음에 올거야 그냥 정규식 따옴표로 취급하십시오 특별한 것으로 취급하지 마십시오 텍스트에 있습니다 그냥 그대로 취급하십시오

" 실제 슬래시를 보내려면 두 개의 슬래시를 보냅니다 첫 번째 사람은 "다음 캐릭터를 실제 캐릭터로 다루십시오"라고 말하면서 그것은 작동하지만 clunky

그리고 잠시 동안, 이런 종류의 "보통 영어로 명령 보내기" 일을 몇 가지 언어로 작동시키는 유일한 방법이었습니다 세계에서 가장 보편적으로 사용되는 웹 프로그래밍 언어 인 PHP를 포함합니다 이 상황을 악화 시키려면 슬래시를 추가하라는 명령은 훌륭하게 다루기 힘들었습니다 mySQL (데이터베이스의 이름입니다) _레알 _탈출 _끈

그런 다음 원하는 텍스트를 입력하십시오 "escape_string"은 당신이 원하는 것을하고, "mySQL"은 데이터베이스의 이름이고, 및 "진짜", 왜냐하면 첫번째 것이 작동하지 않았기 때문에 이전 버전과의 호환성 때문에 변경하지 못했습니다 따라서 원래의 문자열을 사용한 사람은 누구나 10 년 전의 것 같은데, 하지만이 원래 형식을 사용하는 사람 : 완전히 불안합니다 패치를 작성하기보다는 "진짜"라는 단어를 추가했습니다 누가 그것을 잊었거나 모든 문서를 읽지 않았습니까? 네

누구든지 데이터베이스를 효과적으로 삭제할 수 있습니다 또는 다른 사람의 계정을 업데이트하거나 다른 사람의 암호를 읽는 것과 같은 더 미묘한 작업을 수행하십시오 일단 데이터베이스에 액세스하면 작동 방법을 알아 내면, 당신이 할 수있는 일은별로 없습니다 그리고이 문제를 해결하는 것은 쉽습니다 이 오류가 코드에서 한 번만 잘못되는 경우, 그리고 내가 잘못 이해할 수없는 많은 미묘한 방법들이 있습니다

따옴표를 피하는 것을 잊어 버리는 것만이 아닙니다 틀리게 만드는 방법은 정말 미묘합니다 그렇게하면 웹 응용 프로그램을 사용할 수 없습니다 누군가 거기에 방법이 있다는 것을 알아 내면, 사용자 이름에 따옴표가있는 사용자 이름을 만들고 시도하기 때문에, 그럼 행운을 빌어 요! 모든 사람의 암호에 작별 인사를하십시오 그것이 행해져 야하는 방식은 준비된 진술이라고 불리는 것입니다, 그리고 만약 당신이 데이터베이스와 관련된 어떤 것을 프로그래밍한다면, 지금 준비된 진술을 사용해야합니다

그들이 일하는 방식은 그것은 해킹입니다 해킹에 대한 해킹입니다

솔직히 말해서, 프로그래밍 언어로부터 그러한 종류의 평이한 영어 SQL 명령을 보내는 것, 그것은 해킹입니다 그리고 나서 우리는 그 위에 더 많은 것을 넣어야하고 그 위에 더 많은 것을 넣어야합니다 그러나 준비된 진술은 적어도 그것을 안전하게 유지합니다 준비된 명령을 사용하여 조회를 보냄니다

"SELECT * FROM users where username =" 그런 다음 '?'라고 말하면됩니다 그리고 그 물음표는, 당신은 나중에 나중에 말합니다 "맞아, 이건 내가 넣고있는 데이터 야 이것은 명령이 아닙니다 그것이 무엇이든간에 아무 것도하지 마십시오

이것은 안전하지 않습니다 그냥 가져 가서 대단히 조심스럽게 다루고 데이터베이스에 저장하고 그 이상으로 보지 마십시오 " 그것은 그보다 조금 더 복잡합니다 저는 카메라와 대화하기 위해 대규모로 단순화하고 있습니다 그리고 만약 당신이 웹 프로그래밍이라면, 당신은 당신이해야 할 일의 최근 보안 가이드 라인 등을 찾아 봐야한다

그러나, 이것이 당신이 사용해야하는 것입니다 지금 당장, 준비된 문장을 사용하지 않으면 응용 프로그램의 어느 부분에서든 실수가 발생합니다 당신이 인용 부호를 넣는 것을 잊어 버린 곳 중 하나, 또는 유니 코드 문자를 사용하는 미묘한 방식으로 엉망으로 만든다 또는 경이롭게 복잡한 무엇인가, 특히 Microsoft 데이터베이스를 사용하는 경우 그것은 Windows를 사용하는 사람으로부터 온 것입니다 준비된 진술을 사용하지 않는다면, 당신은 취약합니다

당신은 그것을 고칠 필요가 있습니다 그러나 말은 해킹이 진행됨에 따라 더 나쁜 것이 있습니다