从原理—实战分析SQL注入
前言
SQL注入是web安全中最常见的攻击方式,SQL注入有很多方法,但如果只知道payload或只用用sqlmap,不知道原理,感觉也很难掌握,这次就总结一下我所遇到的SQL注入方法,原理分析+题目实战。
- Xpath报错注入
涉及函数
updatexml(): 对xml进行查询和修改
extractvalue():对xml进行查询和修改
1.报错语句构造
select extractvalue(1,concat(0x7e,user(),0x7e));

select updatexml(1,concat(0x7e,version(),0x7e),1);

原理分析
extractvalue(xml_str , Xpath) 函数,按照Xpath语法从XML格式的字符串中提取一个值,如果函数中任意一个参数为NULL,返回值都是NULL。
其实就是对XML文档进行查询的函数,相当于HTML文件中用
等标签查找元素一样,第一个参数传入目标xml文档,第二个参数使用Xpath路径法表示的查找路径
updatexml()函数与extractvalue()类似,是更新xml文档的函数
updatexml()函数有三个参数,分别是(XML_document, XPath_string, new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
题目实战
sqli-labs17关,涉及到xpath报错注入
uname尝试发现没有任何变化,尝试下passwd,发现单引号报错,且有报错信息,可以使用xpath报错注入 尝试下爆出数据库
uname=admin&passwd=1' or updatexml(1,concat(0x7e,database(),0x7e),1)# &submit=Submit

既然xpath报错注入可以,那就来一一爆出表、字段、值即可
2. 宽字节注入
涉及函数
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
mysql_real_escape_string() 函数转义SQL语句中使用的字符串中的特殊字符
mysql_escape_string() 转义一个字符串
原理分析
先了解一下什么是窄、宽字节已经常见宽字节编码:
一、当某字符的大小为一个字节时,称其字符为窄字节.
二、当某字符的大小为两个字节时,称其字符为宽字节.
三、所有英文默认占一个字节,汉字占两个字节
四、常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等
题目实战
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%27
返回结果

发现被转义了,使用最经典的%df
?id=1%df' and 1=1%23
返回结果为:

%df和后面的\变成了一个汉字“运” ,所以单引号就可以不被转义,从而发挥闭合作用
爆出数据库,下面就很简单了,相当于知道了闭合符号,常用的payload更改一下即可
3. 叠堆注入
涉及字符
;,在SQL语句中用来表示一条sql语句的结束
原理分析
堆叠注入可以执行任意的语句,多条sql语句一起执行。在MYSLQ命令框中,常以;在位结束符,那我们边便可以在一句SQL语句结束后再紧跟一句SQL语句。
查询数据表
1';show databases;#
4. 二次注入
涉及函数
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符
mysql_escape_string() — 转义一个字符串
二次注入原理
看到涉及到的函数是不是感觉很熟悉,这是因为大多数网站都会对用户输入的语句进行对特殊符号的过滤,例如:恶意用户构造的插入语句为1',经过这些函数的处理则变为1',这样便可以防止用户向服务器插入数据时引发的一些恶意操作,但这只是中途过滤了一下,最终返回到数据库里面的数据还是1',如果管理者对取出的数据没有进行进一步的检验处理,服务器从数据库取出恶意数据,未经过滤就直接拼接SQL语句进行查询,就会发生了SQL二次注入。
https://xzfile.aliyuncs.com/media/upload/picture/20191030191521-8fffd9ea-fb06-1.png
总结起来 二次注入其实是分为两个步骤:
1.插入恶意数据
2.引用恶意数据
题目实战
SQL-labs24关便涉及到二次注入
注册用户源码

修改密码源码

我们先注册一个用户admin'#,密码设置为123,注册好之后查看一下数据库

注册成功,这时其实我们就可以修改管理员admin,为什么那,来看下修改密码的sql语句

我们用户名为admin'#,调用该用户时,SQL语句则变为了

我们将admin密码更改为123456,测试一下

更改成功,这便是二次注入的简单利用

浙公网安备 33010602011771号