pick靶场-sql注入

甲.数字型注入

数字型注入一般提交值没有引号,所以直接在后面构造语句就可以了。

 

 抓包查看

 

 构造语句

 

 提交后

 

该数据库表内容被爆出来了。

 

乙.字符型注入

 

首先我们要知道一点,字符串在数据库中提交是需要用引号将字符串包含的。所以字符型注入一般需要用到引号来闭合字符串,闭合引号后就可以接执行的sql语句,就可以执行。

name='kobe'

这时候需要构造语句  'or 1=1# 单引号是为了闭合1前面的单引号,#是为了注释掉后面语句

 

这里输入kobe提交后显示了uid和email,猜测语句是 select uid,email from 表 where username='输入的值'

这里要构造语句,输入的值变成'or 1=1#。那么查询语句就是select uid,email from 表 where username=''or 1=1#'

闭合单引号后,把后面一个单引号注释掉。

尝试读取数据库信息。

使用order by 猜表字段数

 

表字段数为2,开始构造语句

 database() 数据库名

 version() 数据库版本

 user()

 

22'  union select  database(),user()#

这里了解下mysql中information_schema数据库,他可以帮助我们查询更多信息。

 

Mysql 5.0以上中,information_schema数据库会记录当前数据库信息。

information_schema.tables 表名信息

information_schema.columns  列名信息

Table_name 表名

Column_name 列名

Table_schema  数据库名

 

group_concat用来合并多条数据记录,可用来合并结果。

因此,查询当前数据库下表名可以使用(group_concat使用与否均可,主要看返回信息。)

group_concat(table_name) from information_schema.tables where table_schema = database()

查询表中列名

group_concat(column_name) from information_schema.columns where table_name = '列名'、

 

丙.搜索型注入

搜索框中的数据库语句一般是采用的查询语句,这里我们先了解下sql查询语句

SQL提供了四种匹配模式:% _ [ ] [^ ]

 

1. %

%表示模糊匹配0或多个字符,如以下查询语句:

select * from user where name like '%三%'; 这个语句将会把name中带有“三”的信息全部查找出来

select * from user where name like '%三' ; 这个语句将会把name中最右边带有“三”的信息全部查找出来

select * from user where name like '三%' ; 这个语句将会把name中最左边带有“三”的信息全部查找出来

 

2. _

_表示任意单个字符,如以下语句:

select * from user where name like '_三_'; 这个语句会匹配出“二三四”

select * from user where name like '__三'; 这个语句会匹配出“一二三”

 

3. [ ]

[ ]表示括号内所列字符中的一个(类似于正则表达式),如以下语句:

select * from user where name like '老[大二三]'; 如果都存在的话将找出“老大”、“老二”、“老三”

同时支持缩写0-9、a-z等。

 

4.[^ ]

类似于正则表达式,将括号内的元素排除,如以下语句:

select * from user where name like '[0-3]个' 将会检索出除了“0个”,“1个”,“2个”,“3个”

————————————————

版权声明:本文为CSDN博主「MuffinFish」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_36113598/article/details/79372493

 

看题目,首先输入ko,能够查询出来

 

再输入ob,也可以查询出来

 

很明显,这里使用的语句,应该是%这种类型的模糊查询方式。

猜测语句是select username,uid,email from 表 where username='%输入的值%'

构造语句,直接使用'or 1=1#

'闭合掉字符串,然后使用#注释掉后面的%'

 

sql语句很灵活,闭合前一个语句后,可以使用联合查询查询数据库信息,比如'union select user(),2,3#

 

 

丁.xx注入

先试一试'union select 1,2#

报错显示You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union select 1,2,3#')' at line 1

发现我们写的语句后面有个引号和括号,尝试构造语句闭合

') union select 1,2,3#

报错select列的数量不匹配,说明执行了我们构造的语句。尝试改成') union select 1,2#

爆表数据就要用 ')or 1=1#

戊.insert/update注入

insert/update/delete注入

在这3种情况中,我们不能使用 union 去做联合查询,因为这不是查询,而是操作。首先猜测语句类型,是查询类的可以通过union语句来查询。

 

首先,添加用户的地方是对数据库表进行写入操作。

我们要了解,sql中写入新数据,用的语句是

INSERT INTO 表名称 VALUES (值1, 值2,....)

我们也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

使提交报错也印证了语句是用是insert into语句

 

首先要了解insert注入一般使用的语句

extractvalue(1,concat(0x7e,(database()))) and '1'='1'

extractvalue() :对XML文档进行查询的函数

语法:extractvalue(目标xml文档,xml路径)

第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。

 

正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错

 

concat函数是mysql的字符串连接函数

里面可以执行sql语句

select concat(0x7e,(select user()) ,0x7e)

验证结果:16进制也能被自动转义(0x7e是 ~符号)

下面故意写入语法错误:

select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))

 https://blog.csdn.net/zpy1998zpy/article/details/80631036

 就是使extractvalue函数中第二个参数变成~select detabase(),这样与extractvalue函数规定的语法不同,就会引起报错。

在写入数据的地方使用构造语句

ttt'and extractvalue(1,concat(0x7e,(database()))) and '1'='1

 

updatexml()

做数据修改的时候会存在update注入的地方

 

updatexml()函数与extractvalue()类似,是更新xml文档的函数。

语法updatexml(目标xml文档,xml路径,更新的内容)

报错语句为

select username from security.user where id=1 and (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))

构造语句

aa' and updatexml(1,concat(0x7e,(database())),1) and '1'='1

 

 其实也可以使用extractvalue(),只要有报错,会执行我们构造的语句就成。

 

己.delete注入

sql中删除数据一般使用

DELETE 语句

DELETE 语句用于删除表中的行。

语法

DELETE FROM 表名称 WHERE 列名称 = 值

 

点击删除

抓包看

 删除的列名为id,值为59。不为字符串,可直接构造语句

and extractvalue(1,concat(0x7e,(database())))

 url上改直接输入

改数据包需要使用空格实体或者+

庚.http header

web渗透很多地方都涉及到数据包头部的改写,我这里就不多说。

这题很坑的地方在于,不了解后端代码是怎么写的做起来很别扭,因为这题目要显示出包头的信息根本不需要将包头信息存储在数据库中。代码里倒是写进数据库了,但后面调用是直接读前端获取到的头部信息,没有从数据库中读取,可能作者是想做个类似访问记录的东西。

 

辛.boolian盲注

根据返回信息判断语句是否正确。

基于真假的盲注主要特征

  • 没有报错信息
  • 不管是正确的输入,还是错误的输入,都只有两种情况(可以看做 0 or 1)
  • 在正确的输入下,后面跟 and 1=1 / and 1=2 进行判断

 

kobe' and 1=1#
kobe' and 1=2#

发现一条正确执行,一条显示用户名不存在,说明后台存在 SQL 注入漏洞

length(database()) 判断 数据库名称的长度

kobe' and length(database()) >5#

 

SUBSTR函数

 substr(database(), 1, 1) 截取数据库名称第一个字符

ascii(substr(database(), 1, 1)) 截取数据库名称第一个字符,转换成ascii值

kobe' and ascii(substr(database(), 1, 1)) > 105# 判断数据库名称第一个字符ascii值的大小

 

判断出数据库名称后可以使用substr(database(),1,1)='字母'#

进行爆破,然后substr(database(),2,1)='字母'#依次爆破,得出完整数据库名。

 

这里简要说明下SUBSTR函数:

SUBSTR函数是用来截取数据库某一列字段中的一部分。

在各个数据库的函数名称不一样

MySQL: SUBSTR( ), SUBSTRING( )

Oracle: SUBSTR( )

SQL Server: SUBSTRING( ) ;

常用的方式是:

SBUSTR(str,pos);

就是从pos开始的位置,一直截取到最后。

 

还有一种比较常用的是:

SUBSTR(str,pos,len);

这种表示的意思是,就是从pos开始的位置,截取len个字符(空白也算字符)。

需要注意的是:如果pos为1(而不是0),表示从第一个位置开始。

————————————————

版权声明:SUBSTR函数说明为CSDN博主「呼啸」的原创,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/howlaa/article/details/16825761

 

壬.延时盲注

构造语句,使语句提交操作延时,来判断构造的语句是否正确。

kobe' and sleep(3)#

该语句表示如果存在kobe,则延时提交3秒。

根据这个方法,可以组合其他语句来猜解当前数据库信息。

 

lili' and if(substr(database(),1,1)='p',sleep(5),1)#

 

盲注可以通过爆破来辅助猜解,具体参考https://www.cnblogs.com/paperpen/p/12324363.html

癸.宽字节注入

宽字节注入是因为数据库使用了GBK编码,多字节的编码,两个字节代表一个汉字。

注入中单引号存在被反斜杠转义的情况。\',其中\的十六进制是 %5C。%df'被转义成%df\',就变成了%df\'=%df%5c%27,%df%5c 是一个宽字符,也就是縗,也就是说:%df\' = %df%5c%27=縗'。单引号就可以按照初期想法被识别。

构造语句kobe%df%27 or 1=1#,通过网页修改无效,直接修改数据包,成功。

猜你喜欢

转载自www.cnblogs.com/pykiller/p/13198601.html