czwartek, 21 października 2010

PWDCOMPARE

O znaczeniu silnych haseł napisano już tony stron, wszyscy wiedzą, że hasła nie moga być banalne zbyt krótkie itd.   tu artykuł Microsoft
SQL Serwer od wersji 2005 wspiera nas wymuszonymi zasadami haseł  przy pomocy CHECK_POLICY, które korzystając z biblioteki odpowiedzialnej za hasła systemowe tworzą dla niego regóły.
Dla Windows Server 2003 i nowszych są to zasady zdefiniowane w security policies,
w starszych systemach nie dopuści do
  •  Pustego hasła (Null)
  •  Hasła takiego samego jak nazwa komputera lub użytkownika
  •  Na hasło proste typu „password”, „admin”, „administrator”, „sa”, „sysadmin”

Problem zaczyna się gdy z jakiegoś powodu musimy zakładać usera z opcja CHECK_POLICY=OFF, z pomoca przychodzi nam funkcja PWDCOMPARE.
Porównuje ona wartośc podstawioną jako tekst z wartością „zachaszowaną” w tabeli master.dbo.syslogins dla <2005 i widokiem master.sys.sql_logins dla >=2005 jeżeli są zgodne zwraca 1. Przy pomocy funkcji nie jesteśmy w stanie odczytać hasła ale możemy sprawdzić jego poprawność i to nam wystarczy.


SET NOCOUNT on
CREATE TABLE #zle_hasla (kto VARCHAR(50),pass VARCHAR(10),dlaczego VARCHAR(200))

INSERT #zle_hasla
SELECT name, name,'puste hasło'
FROM sys.sql_logins
WHERE PWDCOMPARE('',password_hash) =1

INSERT #zle_hasla
SELECT name, name,'hasło takie samo jak login'
FROM sys.sql_logins
WHERE PWDCOMPARE(name,password_hash) =1

CREATE TABLE #hasla(pass varchar(10))
go
INSERT #hasla
SELECT 'haslo'
UNION SELECT'qwerty'
UNION SELECT'...

Do tabeli zassałem 100 najczęstrzych haseł uzywanych przez Polaków, tabelka znaleziona kiedyś w necie

INSERT #zle_hasla
SELECT l.name,h.pass,'hasło z 100 najpopularniejszych haseł'
FROM #hasla h CROSS JOIN sys.sql_logins l
WHERE PWDCOMPARE(h.pass,l.password_hash) =1

Buduję tabelę ze znakami ascii dostępnymi z klawiatury

CREATE TABLE #char (txt VARCHAR(1))
DECLARE @i int
SET @i=33
WHILE @i <122
BEGIN
INSERT #char
SELECT CHAR(@i)
SET @i =@i+1
END

INSERT #zle_hasla
SELECT l.name,h.txt,'hasło ma tylko jeden znak'
FROM #char h CROSS JOIN sys.sql_logins l
WHERE PWDCOMPARE(h.txt,l.password_hash) =1

Jak ktoś ma więcej czasu to może najpierw robic iloczyn kartezjański z tej samej tabeli i mieć dwu znakowe hasła, lub więcej.
Pomysłów co można sprawdzać może być jeszcze więcej np. przepuśćić przez bazę imion itd.

SELECT * FROM #zle_hasla

Mamy zestawienie haseł które mogą być łatwo złamane w systemie, co tak naprawde przed chwilą zrobiliśmy.

Brak komentarzy:

Prześlij komentarz