| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | substring i stored procedure kun 32 tegn l~ Fra : Leif Neland | 
  Dato :  30-10-08 13:20 |  
  |   
            I et forsøg på at rydde op i en sqlinjected testdatabase, brugte jeg et 
 script, der skulle slette alle forekomster af en bestemt streng i 
 tekstfelter.
 
 Efter noget gymnastik med at lede alle tabeller igennem efter 
 tekstfelter, der indeholder det inficerede, kommer scriptet frem til dette:
 
 exec ('update ' + @t + ' set ' + @c + ' = replace(substring('+ @c + 
 ',1,4000),''' + @sqlInjectString + ''', '''')')
 
 Der bliver til f.ex.
 update tabl set felt = replace(substring(felt,1,4000),'<script>noget 
 væmmeligt</script>', '')
 
 Men nu er alle felter blevet trunkeret til max 32 tegn.
 
 Hvordan kan det nu være??
 
 Nå, indholdt af databasen er alligevel uaktuelt og skal laves igen, men 
 det kunne da være rart at have et fungerende script alligevel...
 
 Jeg brugte enterprise manager til at gemme scriptet som en stored 
 procedure, og køre det.
 
 Leif
  
            
             |   |   
            
        
 
            
         
           Stig Johansen (30-10-2008) 
         
	
            | Kommentar Fra : Stig Johansen | 
  Dato :  30-10-08 13:48 |  
  |   |   |   
            
        
 
            
         
           Leif Neland (30-10-2008) 
         
	
            | Kommentar Fra : Leif Neland | 
  Dato :  30-10-08 14:10 |  
  |  
 
            Stig Johansen skrev:
 > Leif Neland wrote:
 > 
 > [snip SQL-injection] 
 > 
 > Hvis det er dét jeg tror det er, så har jeg ævlet lidt om det her:
 > < http://w-o-p-r.dk/storm.monitor/SQL.injection/>
> 
 Det er det sådan set, og ganske interessant ævl, må man sige   
Jeg undrer mig dog stadig hvorfor
 update tabl set felt = replace(substring(felt,1,4000),'<script>noget 
 væmmeligt</script>', '')
 trunkerer til 32 tegn.
 Jeg brugte substring(felt,1,4000), fordi replace() ikke ville have en 
 ntext som parameter.
 Leif
            
              |   |   
            
        
 
            
         
            Stig Johansen (30-10-2008) 
         
	
            | Kommentar Fra : Stig Johansen | 
  Dato :  30-10-08 15:43 |  
  |  
 
            Leif Neland wrote:
 > Stig Johansen skrev:
 >> Hvis det er dét jeg tror det er, så har jeg ævlet lidt om det her:
 >> < http://w-o-p-r.dk/storm.monitor/SQL.injection/>
>> 
 > Det er det sådan set, og ganske interessant ævl, må man sige   
> 
 > Jeg undrer mig dog stadig hvorfor
 > update tabl set felt = replace(substring(felt,1,4000),'<script>noget
 > væmmeligt</script>', '')
 > trunkerer til 32 tegn.
 Det er lidt en 'wrap-up' over flere varianter, nogle varianter med 'fejl'.
 Men den du skriver dér ligner mere at man (dig(?)) vil fjerne 'lortet'.
 Sætningen:
 ....
 update tabl set felt = replace(substring(felt,1,4000),'<script>noget
 væmmeligt</script>', ''
 ....
 fjerner første instans af (måske tidligere) <script> injection.
 Hvis vi skal dykke ned i hvorfor det bliver truncated til 32 tegn, så må du
 levere et datasæt, der beskriver indholdet.
 > Jeg brugte substring(felt,1,4000), fordi replace() ikke ville have en
 > ntext som parameter.
 Jeg er stadig lidt i tvivl om du laver 'forensic analyse' på hvad der er
 sket, eller du er ved at udvikle et 'rep kit'.
 Men de første varianter at 'kineseren' benyttede hex encoding af utf-16 (aka
 ntext).
 -- 
 Med venlig hilsen
 Stig Johansen
            
              |   |   
            
        
 
            
         
           Peter Lykkegaard (30-10-2008) 
         
	
            | Kommentar Fra : Peter Lykkegaard | 
  Dato :  30-10-08 14:14 |  
  |   
            "Leif Neland" skrev
 
 > I et forsøg på at rydde op i en sqlinjected testdatabase, brugte jeg et 
 > script, der skulle slette alle forekomster af en bestemt streng i 
 > tekstfelter.
 > Men nu er alle felter blevet trunkeret til max 32 tegn.
 >
 Hvad mange karakterer kan du gemme i feltet?
 Måske er der sket noget ala dette?
 
 Declare @myField nvarchar(20)
 Set @myField = 'Noget indhold'
 
 Print 'Before SQL injection'
 Select @myField As myField
 
 Set @myField = 'Noget grimt script' + @myField
 
 Print 'After SQL injection'
 Select @myField As myField
 
 Print 'After cleanup'
 Set @myField = Replace(@myField, 'Noget grimt script', '')
 Select @myField As myField
 
 - Peter 
 
  
            
             |   |   
            
        
 
            
         
           Leif Neland (30-10-2008) 
         
	
            | Kommentar Fra : Leif Neland | 
  Dato :  30-10-08 14:23 |  
  |   
            Peter Lykkegaard skrev:
 > "Leif Neland" skrev
 > 
 >> I et forsøg på at rydde op i en sqlinjected testdatabase, brugte jeg 
 >> et script, der skulle slette alle forekomster af en bestemt streng i 
 >> tekstfelter.
 >> Men nu er alle felter blevet trunkeret til max 32 tegn.
 >>
 > Hvad mange karakterer kan du gemme i feltet?
 > Måske er der sket noget ala dette?
 > 
 
 Det er sket i alle felter, selvom de var f.ex. nvarchar(50) eller ntext, 
 der jo er meget lange.
 
 Der er heller ikke defineret en variabel til at holde feltindholdet i 
 scriptet, scriptet bygger en sql-sætning og udfører den:
 - - - - -
 DECLARE fixSQLInject_Cursor
 CURSOR FOR
 select t,c from tmp_tableInfected
 
 OPEN fixSQLInject_Cursor
 FETCH NEXT FROM fixSQLInject_Cursor INTO @T,@C
 WHILE(@@FETCH_STATUS=0)
 BEGIN
 
        exec ('update ' + @t + ' set ' + @c + ' = replace(substring('+ @c 
 + ',1,4000),''' + @sqlInjectString + ''', '''')')
 
 FETCH NEXT FROM fixSQLInject_Cursor INTO @T,@C
 END CLOSE fixSQLInject_Cursor
 DEALLOCATE fixSQLInject_Cursor
 - - - - - - - - -
 Hvilket f.ex. ville udføre
 update tabel set felt = replace(substring(felt,1,4000),'<script>noget 
 væmmeligt</script>', '')
 
 Leif
  
            
             |   |   
            
        
 
            
         
            Stig Johansen (30-10-2008) 
         
	
            | Kommentar Fra : Stig Johansen | 
  Dato :  30-10-08 15:55 |  
  |   
            Leif Neland wrote:
 
 Det er ikke voldsomt mange eksempler du smider her, men..
 
 > Der er heller ikke defineret en variabel til at holde feltindholdet i
 > scriptet
 ....[snip]...
 > FETCH NEXT FROM fixSQLInject_Cursor INTO @T,@C
 jeg vil gætte på, i forhold til det du skriver, at det vil give et par fejl:
 '@T not declared'
 '@C not declared'
 (Du har ikke nogen DECLARE på disse to i dit skriv)
 
 Det er ikke nemt for os andre at vide hvad du sidder med.
 
 -- 
 Med venlig hilsen
 Stig Johansen
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |