3个月前 (07-17)  网站建设 |   抢沙发  13 
文章评分 6 次,平均分 5.0

今儿先给sqlmap打个前战,博主讲讲sql注入的几个技巧和注入思路。

一、注入点出现在哪里?

要想利用注入,首先你得挖到一个注入点,在大多数的业务场景中,搜索框是一个容易出现注入的地方,一般的sql语句如下:

1
SELECT p.*, pac.all_cities FROM {p}_page AS p LEFT JOIN {p}_page_all_cities pac ON p.page_id=pac.page_id AND p.lang=pac.lang LEFT JOIN {p}_page_all_provinces pap ON p.page_id=pap.page_id AND p.lang=pap.lang WHERE p.[lang] = N'2' AND p.[hidden] = N'0' AND p.[parent_id] =14 AND ( p.[title] LIKE N'%sql%' ) AND (p.[pri4]=N'1' OR p.[pri5]=N'1' OR p.[pri6]=N'1' OR p.[sec1]=N'1' OR p.[sec2]=N'1' OR p.[sec3]=N'1' OR p.[sec4]=N'1' OR p.[sec5]=N'1' OR p.[sec6]=N'1') AND ( wholeyear=N'1' OR year1m9=N'1' OR wholeyear=N'1' OR year2m1=N'1') ORDER BY wholeyear

大家是不是和初学者或者懂一点编程技巧的人一样?看到这里会说如果后端采用了预编译或者mybatis占位符就轻松防止了sql注入呢?其实这点是对的,但是保不齐一些老旧的代码和不负责的开发人员为了省事而买下来注入的伏笔。

还有就是order by的注入点,SQL预编译会解决sql注入问题,但是有些地方是不能参数化的。

比如order by后就不能参数化,挖注入的时候看准orderby、sort参数,一挖一个准。

为什么orderby不能参数化查询?

再重点关注下日期类型的参数,形如

1
SELECT * FROM `wp_posts` WHERE post_content LIKE '%%' AND post_date BETWEEN '2020/01/01' AND '2020/09/02'

日期类型

如果在接受参数的时候没有进行强制类型转换很容易出现注入问题,也是直接拼接的原因。搜索orderby、limit、日期类型,其实这些大家都知道,测的时候细心一些就可以了。博主通常习惯于每个参数都测一测,lang=cn参数有注入的情况也不是没有。

二、如何快速定位重要数据表

渗透中总是有一些大型的数据库,一个数据库中有几百个表,一个一个看脑壳疼。这个时候sqlmap有一个参数叫做--search,可以用来搜索列、表或数据库名称。

--search -D:搜索某个数据库

--search -T:搜索某个表名

--search -C:搜索某个字段名

通过搜索形如username、password的字段即可快速定位重要数据表。

三、大数据表托数据

一般上是直接托文件,比如mysql可以用自带的mysqldump,如果是站库分离可以自己传一个mysqldump上去指定-h参数就行了。

mysqldump是没有依赖的,单exe就能运行,直接拖sql文件比一点一点拖快得多。

mssql的话直接拖mdf,或者osql命令。

四、注入读写文件

以下全部基于你有路径的前提下。

当你通过注入没有下一步思路的时候,就要考虑读写文件了。

读写文件很多情况下都需要用到堆叠语句,MySQL中如果用的是mysqli pdo处理的话,有的可以堆叠,mssql+aspx是原生堆叠,Oracle要看代码层面是怎么写的,具体根据实际判断吧,环境不一样问题不一样。

MySQL读文件值得一提的就是load data infile和load data local infile,不受secure-file-priv的限制,但是需要堆叠,或者你也可以找找phpmyadmin,phpmyadmin的话还受到open_basedir限制。

通过注入拓展任意文件读取,也算一种思路吧。

如果你是mysql低权限账户可以试着读一下user.MYD,万一读到root密码呢?

至于load data local infile的权限问题一直是一个谜,我理解的他的权限应该是和MySQL的权限一样的,因为碰到了一次读不到apache用户www目录下的源码,MySQL用户和apache权限不一样。

但是其实我自己都不是很确定,希望有师傅看到了指点一下。

MySQL写文件的话into outfile、into dumpfile还有就是日志写文件general log,绝对路径写shell,插件写udf,写mof。

mssql的话读写文件的操作更多样化一些。

列目录xp_dirtree、xp_subdirs写文件xp_cmdshell 'echo 1 > c:/1.txt'、sp_oacreate、sp_oamethod配合写shell

1
2
3
4
DECLARE @sp_passwordxieo INT, @f INT, @t INT, @ret INT;
EXEC sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo OUT;
EXEC sp_oamethod @sp_passwordxieo, 'createtextfile', @f OUT, 'c:/www/1.aspx', 1;
EXEC @ret = sp_oamethod @f, 'writeline', NULL,'this is shell';

或者出网的话直接写一个vbs下载器,随意发挥。

读文件的话

1
2
3
4
5
USE test;
DROP TABLE cmd;
CREATE TABLE cmd ( a text );
BULK INSERT cmd FROM 'd:/config.aspx' WITH (FIELDTERMINATOR = 'n',ROWTERMINATOR = 'nn')
SELECT * FROM cmd

站库分离的话看下数据库服务器有没有web服务,如果直接访问IP是iis默认页面可以直接往iis的默认目录写aspx。没有web服务的话可以写一个dns的马进去,xp_cmdshell执行,或者调用wscript.shell执行。

postgresql的copy from,copy to读写文件,要是有别人的马直接读文件岂不是更方便。

执行命令

MySQL udf mof不说了mssql xp_cmdshell、自己创建clr、调用wscript.shell、调用Shell.Application、写启动项、写dll劫持。

之前碰到过一个站库分离,有xp_cmdshell,但是只出dns的。

通过certutil转exe为base64,通过echo写入文件,调用目标的certutil转回exe执行上线。

其他利用场景

任意文件上传,没有路径,找找注入在数据库中肯定存储了文件的路径,配合sqlmap的--sql-shell和--search参数就能找到shell地址。

五、总结

今儿就跟大伙浅谈一下sql注入的基本实现思路和技巧,博主下期会带来博主自身的注入实践,帮助大家在实战中体会注入的艺术。

PS:本篇仅用于自学安全防护,请勿用于其他用途!请勿用于其他用途!

 

除特别注明外,本站所有文章均为叶荣添原创,转载请注明出处来自https://www.wzxiaolou.com/307.html

关于

发表评论

表情 格式

暂无评论

切换注册

登录

忘记密码 ?

切换登录

注册

您是第 6600 位访客, 您的IP是:[100.24.125.162]